【问题标题】:Add Sum to all grouped rows in pandas dataframe将 Sum 添加到 pandas 数据框中的所有分组行
【发布时间】:2021-05-03 22:41:56
【问题描述】:

我有一个数据框,我想将它的“第一”和“第二”列分组,然后产生如下所述的预期输出:

df = pd.DataFrame({'First':list('abcababcbc'), 'Second':list('qeeeeqqqeq'),'Value_1':np.random.randint(4,50,10),'Value_2':np.random.randint(40,90,10)})
print(df)

Output>

   First    Second  Value_1     Value_2
0   a         q        17         70
1   b         e        44         47
2   c         e         5         56
3   a         e        23         58
4   b         e        10         76
5   a         q        11         67
6   b         q        21         84
7   c         q        42         67
8   b         e        36         53
9   c         q        16         63

当我使用 groupby 对该 DataFrame 进行分组时,我得到以下输出:

def func(arr,columns):
    return arr.sort_values(by = columns).drop(columns, axis = 1)

df.groupby(['First','Second']).apply(func, columns = ['First','Second'])

                Value_1      Value_2
First Second            
a       e     3     23         58
        q     0     17         70
              5     11         67
b       e     1     44         47
              4     10         76
              8     36         53
        q     6     21         84
c       e     2     5          56
        q     7     42         67
              9     16         63

但是我想要下面的输出:

Expected output:

                Value_1      Value_2
First Second            
a       e     3     23         58
            All     23         58
        q     0     17         70
              5     11         67
            All     28        137   
b       e     1     44         47
              4     10         76
              8     36         53
            All     90         176
        q     6     21         84
            All     21         84
c       e     2     5          56
            All     5          56
        q     7     42         67
              9     16         63
            All     58         130

不必打印“All”字符串,而是打印所有分组行的总和。

【问题讨论】:

    标签: python pandas dataframe pandas-groupby pivot-table


    【解决方案1】:
    df = pd.DataFrame({'First':list('abcababcbc'), 'Second':list('qeeeeqqqeq'),'Value_1':np.random.randint(4,50,10),'Value_2':np.random.randint(40,90,10)})
    
      First Second  Value_1  Value_2
    0     a      q        4       69
    1     b      e       20       74
    2     c      e       13       82
    3     a      e        9       41
    4     b      e       11       79
    5     a      q       32       77
    6     b      q        6       75
    7     c      q       39       62
    8     b      e       26       80
    9     c      q       26       42
    
    def lambda_t(x):
        df = x.sort_values(['First','Second']).drop(['First','Second'],axis=1)
        df.loc['all'] = df.sum()
        return df
    
    df.groupby(['First','Second']).apply(lambda_t)
    
    
                      Value_1  Value_2
    First Second                      
    a     e      3          9       41
                 all        9       41
          q      0          4       69
                 5         32       77
                 all       36      146
    b     e      1         20       74
                 4         11       79
                 8         26       80
                 all       57      233
          q      6          6       75
                 all        6       75
    c     e      2         13       82
                 all       13       82
          q      7         39       62
                 9         26       42
                 all       65      104
    

    【讨论】:

    • 感谢您的回答,这个解决方案让我更容易理解。
    【解决方案2】:

    你可以试试这个:

    1. 通过以下方式重置组中的索引:

      d1 = df.groupby(['First','Second']).apply(func, columns = ['First','Second']).reset_index()

    2. 然后按“第一”和“第二”分组并对值列求和。

      d2 = d.groupby(['First', 'Second']).sum().reset_index()

    3. 在新数据框中创建 'level_2' 列并与初始列连接以获得所需的结果

      d2.loc[:,'level_2'] = '全部' pd.concat([d1,d2],0).sort_values(by = ['First', 'Second'])

    【讨论】:

      【解决方案3】:

      不确定您的功能;但是,您可以将其分成两个步骤:

      创建一个索引数据框,将FirstSecond 列附加到现有索引:

      df.index = df.index.astype(str).rename("Total")
      indexed = df.set_index(["First", "Second"], append=True).reorder_levels(
          ["First", "Second", "Total"]
      )
      
      indexed
      
      
                           Value_1    Value_2
      First   Second  Total       
         a       q       0    17  70
         b       e       1    44  47
         c       e       2    5   56
         a       e       3    23  58
         b       e       4    10  76
         a       q       5    11  67
         b       q       6    21  84
         c       q       7    42  67
         b       e       8    36  53
         c       q       9    16  63
      

      创建一个聚合,按FirstSecond 分组:

      summary = (
          df.groupby(["First", "Second"])
          .sum()
          .assign(Total="All")
          .set_index("Total", append=True)
      )
      
      summary
      
                              Value_1     Value_2
        First     Second  Total       
            a        e    All     23      58
            q             All     28      137
            b        e    All     90      176
            q             All     21      84
            c        e    All     5       56
            q             All     58      130
      

      结合 indexedsummary 数据帧:

      pd.concat([indexed, summary]).sort_index(level=["First", "Second"])
      
                           Value_1    Value_2
      First   Second  Total        
          a   e         3     23  58
                      All     23  58
          q             0     17  70
                        5     11  67
                      All     28  137
          b   e         1     44  47
                        4     10  76
                        8     36  53
                      All     90  176
          q             6     21  84
                      All     21  84
          c   e         2     5   56
                      All     5   56
          q             7     42  67
                        9     16  63
                      All     58  130
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-01-18
        • 2018-04-16
        • 2019-11-07
        • 1970-01-01
        • 1970-01-01
        • 2017-02-07
        • 2013-09-09
        • 1970-01-01
        相关资源
        最近更新 更多