【问题标题】:With 2 group by columns, how can I do a subtotal by each of the group by columns?使用 2 个分组列,如何按每个分组列进行小计?
【发布时间】:2022-01-17 09:07:09
【问题描述】:

熊猫新手。我正在尝试按列在 2 组内进行小计。我已经设法弄清楚如何使用 2 group by 属性求和,但在此范围内,我也试图做一个小计。请看下面的例子-

df.groupby(['Fruit','Name'])['Number'].sum()

输出

Fruit   Name      Number   
Apples  Bob        16
        Mike        9
        Steve      10
                 ------
                   35
                 ------
Grapes  Bob        35
        Tom        87
        Tony       15
                 ------
                   137
                 ------
Oranges Bob        67
        Mike       57
        Tom        15
        Tony        1

我正在寻找的是按数据框中的每个水果显示小计。谢谢!

【问题讨论】:

    标签: pandas dataframe pandas-groupby


    【解决方案1】:

    您可以混合使用unstackassignstack 来执行此操作:

    sums = df.groupby(['Fruit', 'Name'])['Number'].sum().unstack().assign(Total=df.groupby('Fruit').sum()).stack()
    

    输出:

    >>> sums
    Fruit    Name 
    Apples   Bob       16.0
             Mike       9.0
             Steve     10.0
             Total     35.0
    Grapes   Bob       35.0
             Tom       87.0
             Tony      15.0
             Total    137.0
    Oranges  Bob       67.0
             Mike      57.0
             Tom       15.0
             Tony       1.0
             Total    140.0
    dtype: float64
    

    【讨论】:

    • 谢谢,如果我想获得所有水果的小计,我可以将它直接应用于属性 ['Fruit'] 吗?
    • 我不确定你的意思——请你澄清一下吗?
    • 当然,假设我想获得数据框中所有水果的小计,例如苹果的小计,然后是葡萄,然后是橙子。这个方法还能用吗?
    • 如果您执行groupby,并将第一列指定为Fruits,则可以。
    【解决方案2】:

    IIUC,您可以将df.sumdf.groupby.sumlevel=0 一起使用:

    df.sum(level=0) # Will be deprecated
    # or
    df.groupby(level=0).sum()
    

    输出:

    Fruit
    Apples      35
    Grapes     137
    Oranges    140
    Name: Number, dtype: int64
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多