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

00__00__00

tgt在一个Ds数据框内进行汇总keyAgg:我可以轻松总结

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

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

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

有没有一种干净的方法可以将这两个操作结合起来而又不会pd.merge()使两个中间结果都昂贵呢?

耶斯列尔

我认为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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章