【问题标题】:combining idx and agg results after a pandas groupby在熊猫 groupby 之后结合 idx 和 agg 结果
【发布时间】:2020-01-19 07:36:51
【问题描述】:

我在 Ds 数据帧中聚合 tgt keyAgg : 我很容易总结

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

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

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

有没有一种干净的方法来组合这两个操作而不需要花费两个中间结果的 pd.merge()

【问题讨论】:

    标签: python pandas pandas-groupby aggregation


    【解决方案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
    

    【讨论】:

    • 在哪里可以找到字符串值的完整引用,这些值会自动解释为 pd.groupby().agg() 中的函数
    • @00__00__00 - 检查this
    猜你喜欢
    • 1970-01-01
    • 2014-02-25
    • 1970-01-01
    • 2017-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    相关资源
    最近更新 更多