如果两者都返回聚合值,我认为您可以将聚合函数列表传递给 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