【问题标题】:Group by one columns and find sum and max value for another in pandas按一列分组并在熊猫中找到另一列的总和和最大值
【发布时间】:2017-11-27 05:07:36
【问题描述】:

我有一个这样的数据框:

Name  id  col1  col2  col3  cl4 
PL    252  0     747   3     53  
PL2   252  1     24    2     35 
PL3   252  4     75    24    13 
AD    889  53    24    0     95 
AD2   889  23    2     0     13  
AD3   889  0     24    3     6  
BG    024  12    89    53    66 
BG1   024  43    16    13    0   
BG2   024  5     32    101   4   

现在我需要按 ID 分组,对于 col1 和 col4 列,找到每个 id 的总和,并将其放入父列附近的新列中(例如:col3(sum))但是对于 col2 和 col3,找到 max价值。 期望的输出:

Name  id  col1 col1(sum) col2 col2(max) col3 col(max) col4 col4(sum)
PL    252  0       5      747    747     3     24    6    18
PL2   252  1       5      24     747     2     24    12   18
PL3   252  4       5      75     747     24    24    0    18
AD    889  53      76     24     24      95    95    23   33
AD2   889  23      76     2      24      13    95    5    33
AD3   889  0       76     24     24      6     95    5    33
BG    024  12      60     89     89      66    66    0    67   
BG1   024  43      60     16     89      0     66    63   67    
BG2   024  5       60     32     89      4     66    4    67    

计算这个最简单、最快的方法是什么?

【问题讨论】:

    标签: python pandas dataframe group-by


    【解决方案1】:

    当您的 id 上有 groupbysum 时,您可以使用 merge

    pd.merge(df,df.groupby("id").sum().reset_index(), on='id',how='outer')
    

    输出

    【讨论】:

      【解决方案2】:

      您可以使用 groupby/transform 创建所需的列

      df[['col1_sum', 'col4_sum']]=df.groupby('id')['col1', 'cl4'].transform('sum')
      df[['col2_max', 'col3_max']]=df.groupby('id')['col1', 'cl4'].transform('max')
      
          Name    id  col1    col2    col3    cl4 col1_sum    col4_sum    col2_max    col3_max
      0   PL      252 0       747     3       53  5           101         4   53
      1   PL2     252 1       24      2       35  5           101         4   53
      2   PL3     252 4       75      24      13  5           101         4   53
      3   AD      889 53      24      0       95  76          114         53  95
      4   AD2     889 23      2       0       13  76          114         53  95
      5   AD3     889 0       24      3       6   76          114         53  95
      6   BG      24  12      89      53      66  60          70          43  66
      7   BG1     24  43      16      13      0   60          70          43  66
      8   BG2     24  5       32      101     4   60          70          43  66
      

      【讨论】:

        【解决方案3】:

        我知道这很麻烦,但我喜欢链接,所以你可以这样做:

        df = df.groupby('id').
            apply(lambda g: g.assign(
                col1_sum=g.col1.sum(),
                col2_max=g.col2.max()))
        

        基本上,这是对每个组应用基于组的分配命令,然后组合成单个 DataFrame。

        有关每种方法的详细信息,请参阅https://pandas.pydata.org/pandas-docs/stable/api.html

        【讨论】:

          【解决方案4】:

          执行此操作的最(熊猫)原生方式是使用.agg() 方法,该方法允许您指定要对每列应用的聚合函数(就像在 SQL 中所做的那样)。

          文档示例:

          df.groupby('A').agg({'B': ['min', 'max'], 'C': 'sum'})
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2020-06-11
            • 2022-07-14
            • 1970-01-01
            • 2022-01-25
            • 2021-05-20
            • 1970-01-01
            • 2016-12-16
            • 2023-03-28
            相关资源
            最近更新 更多