使用Pandas的groupby后,结合idx和agg的结果

2024-05-26 11:55:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我在keyAgg上的Ds数据帧内聚合tgt: 我很容易算出

Ds.groupby(Ds.keyAgg).tgt.agg([sum])

并导出各组最小值在tgt中的指数

Ds.groupby(Ds.keyAgg).tgt.idxmin()

有没有一种干净的方法来组合这两个操作而不需要昂贵的两个中间结果


Tags: 数据方法ds指数aggsumtgtgroupby
1条回答
网友
1楼 · 发布于 2024-05-26 11:55:33

我认为可以将聚合函数列表传递给^{},如果这两个函数都返回聚合值:

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

相关问题 更多 >