2024-05-26 11:55:33 发布
网友
我在keyAgg上的Ds数据帧内聚合tgt: 我很容易算出
keyAgg
Ds
tgt
Ds.groupby(Ds.keyAgg).tgt.agg([sum])
并导出各组最小值在tgt中的指数
Ds.groupby(Ds.keyAgg).tgt.idxmin()
有没有一种干净的方法来组合这两个操作而不需要昂贵的两个中间结果
我认为可以将聚合函数列表传递给^{},如果这两个函数都返回聚合值:
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,那就是问题:
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调用聚合函数并将最后一个连接在一起:
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
我认为可以将聚合函数列表传递给^{} ,如果这两个函数都返回聚合值:
但如果不是像
cumsum
,那就是问题:然后一个可能的解决方案是使用自定义函数:
或使用
transform
调用聚合函数并将最后一个连接在一起:相关问题 更多 >
编程相关推荐