【问题标题】:Pandas dataframe, how can I group by multiple columns and apply sum for specific column and add new count column?Pandas 数据框,如何按多列分组并为特定列应用总和并添加新的计数列?
【发布时间】:2020-03-17 01:44:55
【问题描述】:

给定一个数据框 df1 如下:

Col1    Col2    Col3    Col4    Col5
-------------------------------------
A       1       AA      10      Test1
A       1       AA      5       Test2
A       2       AB      30      Test3
B       4       FF      10      Test4
C       1       HH      4       Test7
C       3       GG      6       Test8
C       3       GG      7       Test9
D       1       AA      4       Test5
D       3       FF      6       Test6
  • 我想按 Col1、Col2 和 Col3 分组,并且

  • 添加新列计数:每个组的大小

  • 添加新列 Col4_sum :每组中每个 Col4 的总和


输出需求

Col1    Col2    Col3    Count   Col4_sum
----------------------------------------
A       1       AA      2       15
A       2       AB      1       30
B       4       FF      1       10
C       1       HH      1       4
C       3       GG      2       13
D       1       AA      1       4
D       3       FF      1       6

我尝试使用

df1.groupby(['Col1','Col2','Col3']).size 

但只得到 Count 列。

【问题讨论】:

    标签: python pandas pandas-groupby


    【解决方案1】:

    GroupBy.agg 与元组一起使用以指定具有新列名称的聚合函数:

    df = (df1.groupby(['Col1','Col2','Col3'])['Col4']
             .agg([('Count','size'), ('Col4_sum','sum')])
             .reset_index())
    print (df)
      Col1  Col2 Col3  Count  Col4_sum
    0    A     1   AA      2        15
    1    A     2   AB      1        30
    2    B     4   FF      1        10
    3    C     1   HH      1         4
    4    C     3   GG      2        13
    5    D     1   AA      1         4
    6    D     3   FF      1         6
    

    在 pandas 0.25+ 中可以使用 named aggregation:

    df = (df1.groupby(['Col1','Col2','Col3'])
             .agg(Count=('Col5', 'size'), Col4_sum=('Col4', 'sum'))
             .reset_index())
    print (df)
      Col1  Col2 Col3  Count  Col4_sum
    0    A     1   AA      2        15
    1    A     2   AB      1        30
    2    B     4   FF      1        10
    3    C     1   HH      1         4
    4    C     3   GG      2        13
    5    D     1   AA      1         4
    6    D     3   FF      1         6
    

    【讨论】:

    • 非常感谢。还有一个问题,如何将自定义函数应用于 Col4 而不是 sum。
    • @PaitoonGunhong 0 然后把'sum'改成custom_func
    • @PaitoonGunhong - 只能接受一个答案。
    【解决方案2】:

    您可以使用列名和聚合函数的字典。见https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.aggregate.html

    >>> df = pd.DataFrame([[1, 2, 3],
    ...                    [4, 5, 6],
    ...                    [7, 8, 9],
    ...                    [np.nan, np.nan, np.nan]],
    ...                   columns=['A', 'B', 'C'])
    >>> df.agg({'A' : ['sum', 'min'], 'B' : ['min', 'max']})
    #         A    B
    # max   NaN  8.0
    # min   1.0  2.0
    # sum  12.0  NaN
    

    【讨论】:

      【解决方案3】:

      这应该可以解决您的问题。

      df2 = df.groupby(['Col1','Col2','Col3'])['Col4'].agg('sum')
      

      【讨论】:

        【解决方案4】:

        使用 agg 函数和字典,您可以像这样自定义输出

        df.groupby(['Col1','Col2','Col3']).agg({'Col3': ['count'], 'Col4': ['count','sum']})
        

        这应该为 Col1、Col2 和 Col3 返回一个组,同时聚合 Col3 的计数,然后是 Col4 的计数和总和

        【讨论】:

          【解决方案5】:

          另一个更冗长但未提及的解决方案是使用assign function,如下所示:

          df = df1.assign(Count=df1.groupby(['Col1','Col2','Col3']).Col4.transform('size'))
                  .assign(Col4_sum=df1.groupby(['Col1','Col2','Col3']).Col4.transform('sum'))
                  .reset_index()
          

          【讨论】:

            【解决方案6】:

            可以使用pivot_table函数:

            df = pd.pivot_table(df, index=['Col1', 'Col2', 'Col3'], values='Col4', aggfunc=['count', 'sum']).reset_index()
            df.columns = ['Col1', 'Col2', 'Col3', 'Count', 'Col4_sum']
            

            输出:

              Col1  Col2 Col3  Count  Col4_sum
            0    A     1   AA      2        15
            1    A     2   AB      1        30
            2    B     4   FF      1        10
            3    C     1   HH      1         4
            4    C     3   GG      2        13
            5    D     1   AA      1         4
            6    D     3   FF      1         6
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2018-07-17
              • 1970-01-01
              • 2020-02-10
              • 2021-12-13
              • 2011-03-13
              • 2020-01-14
              • 2021-07-04
              • 1970-01-01
              相关资源
              最近更新 更多