假设我有一个具有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
。
答案 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