我正在tgt
上的Ds
数据帧内聚合keyAgg
:
我可以轻松总结
Ds.groupby(Ds.keyAgg).tgt.agg([sum])
并得出每组中tgt最小值的索引。
Ds.groupby(Ds.keyAgg).tgt.idxmin()
是否有一种干净的方法来合并两个操作,而又没有两个中间结果昂贵的pd.merge()
?
答案 0 :(得分:1)
我认为如果两个函数都返回聚合值,则可以将聚合函数列表传递给GroupBy.agg
:
Ds = pd.DataFrame({'keyAgg':[1,1,2,2,3,3,3],
'tgt': [4,8,2,0,4,5,1]})
print (Ds)
keyAgg tgt
0 1 4
1 1 8
2 2 2
3 2 0
4 3 4
5 3 5
6 3 1
df = Ds.groupby('keyAgg').tgt.agg(['sum', 'idxmin'])
print (df)
sum idxmin
keyAgg
1 12 0
2 2 3
3 10 6
但是如果不喜欢cumsum
,那就有问题了:
df = Ds.groupby('keyAgg').tgt.agg(['sum', 'cumsum'])
print (df)
sum cumsum
0 NaN 4
1 12.0 12
2 2.0 2
3 10.0 2
4 NaN 4
5 NaN 9
6 NaN 10
然后一种可能的解决方案是使用自定义函数:
def func(x):
a = x.sum()
b = x.cumsum()
return pd.DataFrame({'sum':a, 'cumsum':b})
Ds[['sum','cum']] = Ds.groupby('keyAgg').tgt.apply(func)
print (Ds)
keyAgg tgt sum cum
0 1 4 12 4
1 1 8 12 12
2 2 2 2 2
3 2 0 2 2
4 3 4 10 4
5 3 5 10 9
6 3 1 10 10
或使用transform
调用聚合函数并最后联接在一起:
df = pd.concat([Ds.groupby('keyAgg').tgt.transform('sum'),
Ds.groupby('keyAgg').tgt.cumsum()], axis=1, keys=('sum','cum'))
print (df)
sum cum
0 12 4
1 12 12
2 2 2
3 2 2
4 10 4
5 10 9
6 10 10