如何将熊猫的“ GROUPBY”函数的结果转换为原始数据帧

时间:2018-11-16 02:58:43

标签: python pandas dataframe

假设我有一个具有6列的Pandas DataFrame和一个自定义函数,该函数接受2或3列中元素的计数并产生布尔输出。从原始数据帧创建groupby对象并应用自定义函数df.groupby('col1').apply(myfunc)时,结果是一个序列,其长度等于col1的类别数。如何扩展此输出以匹配原始数据帧的长度?我尝试了transform,但是无法将其与自定义函数myfunc一起使用。

编辑:

这是示例代码:

A = pd.DataFrame({'X':['a','b','c','a','c'], 'Y':['at','bt','ct','at','ct'], 'Z':['q','q','r','r','s']})
print (A)

def myfunc(df):
    return ((df['Z'].nunique()>=2) and (df['Y'].nunique()<2))

A.groupby('X').apply(myfunc)

Output

我想将此输出扩展为新列Result,以便X列中有a的地方,Result将是True

2 个答案:

答案 0 :(得分:1)

您可以map将groupby返回到原始数据框

A['Result'] = A['X'].map(A.groupby('X').apply(myfunc))

结果如下:

    X   Y   Z   Result
0   a   at  q   True
1   b   bt  q   False
2   c   ct  r   True
3   a   at  r   True
4   c   ct  s   True

答案 1 :(得分:0)

我的解决方案可能不是最好的解决方案,它使用一个循环,但是我认为这很好。

核心思想是您可以通过gdf遍历所有子数据帧(for i, gdf in gp)。然后为每个子数据帧添加列result(在我的示例中为c)。最后,将所有子数据帧合并为一个。

这里是一个例子:

import pandas as pd
df = pd.DataFrame({'a':[1,2,1,2],'b':['a','b','c','d']})
gp = df.groupby('a')  # group
s = gp.apply(sum)['a'] # apply a func
adf = []

# then create a new dataframe
for i, gdf in gp:
    tdf = gdf.copy()
    tdf.loc[:,'c'] = s.loc[i]
    adf.append(tdf)
pd.concat(adf)

来自:

    a   b
0   1   a
1   2   b
2   1   c
3   2   d

收件人:

    a   b   c
0   1   a   2
2   1   c   2
1   2   b   4
3   2   d   4