在熊猫groupby之后合并idx和agg结果

时间:2019-09-18 10:58:24

标签: python pandas pandas-groupby aggregation

我正在tgt上的Ds数据帧内聚合keyAgg: 我可以轻松总结

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

并得出每组中tgt最小值的索引。

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

是否有一种干净的方法来合并两个操作,而又没有两个中间结果昂贵的pd.merge()

1 个答案:

答案 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