[英]In Pandas, how to send the output from groupby transform to the original dataframe?
[英]How to transform the result of a Pandas `GROUPBY` function to the original 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)
我想将此输出扩展为新的列Result
,以便在X列中有a
地方, Result
将为True
。
您可以将groupby map
回原始数据框
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
我的解决方案可能不是最好的解决方案,它使用了循环,但是我认为这很好。
核心思想是您可以遍历for i, gdf in gp
所有子数据帧( 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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.