繁体   English   中英

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

[英]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所有子数据帧( gdffor 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM