【问题标题】:pandas groupby and adding new column熊猫 groupby 并添加新列
【发布时间】:2018-02-06 06:10:01
【问题描述】:

我正在尝试过滤具有 3 列的数据框,我想要做的是:按 col1 和 col2 分组并获取 col3 的最大值并获得 col3 的第二个最大值,但将其插入为新的列:第 4 列

我可以使用下面的方法对其进行分组,但不知道如何获得第二个最大值并将其作为另一列插入:

grouped = df.groupby(['COL1', 'COL2']).agg({'COL3': 'max'})

   COL1  COL2  COL3
0   A    1      0.2 
1   A    1      0.4
3   B    4      0.7   

想要的输出:

   COL1  COL2  COL3  COL4
0   A    1      0.4  0.2
3   B    4      0.7  0.7 

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    您可以使用.nlargest。以下解决方案利用了 Series 构造函数将广播值以匹配索引的形状这一事实。

    df.groupby(['COL1', 'COL2'])['COL3'].apply(
        lambda s: pd.Series(s.nlargest(2).values, index=['COL3', 'COL4'])
    ).unstack()
    

    返回

               COL3  COL4
    COL1 COL2            
    A    1      0.4   0.2
    B    4      0.7   0.7
    

    【讨论】:

      【解决方案2】:

      第一个 sort_values 用于聚合 head 用于第一个和第二个最大值,然后通过 iat 选择以避免错误,如果仅使用一个值进行分组:

      grouped = (df.sort_values(['COL1','COL2','COL3'], ascending=[True, True, False])
                   .groupby(['COL1', 'COL2'])['COL3']
                   .agg(['max', lambda x: x.head(2).iat[-1]])
                )
      grouped.columns = ['COL3','COL4']
      grouped = grouped.reset_index()
      print (grouped)
        COL1  COL2  COL3  COL4
      0    A     1   0.4   0.2
      1    B     4   0.7   0.7
      

      【讨论】:

        【解决方案3】:

        使用带有 group by 的 nlargest 函数,然后重置索引:

        df2 = df.groupby(
                  ['COL1', 'COL2']
              ).apply(
                  lambda x: pd.Series(x.COL3.nlargest(2).values, index=['COL3', 'COL4'])
              ).reset_index()
        

        输出:

           COL1  COL2  COL3  COL4
        0   A    1      0.4  0.2
        1   B    4      0.7  0.7 
        

        【讨论】:

        • 这和我的回答一样:)
        • 是的,你是对的。我发帖时没有注意到你的。
        猜你喜欢
        • 2021-11-19
        • 2015-09-19
        • 1970-01-01
        • 2016-09-08
        • 2019-09-16
        • 2022-01-26
        • 1970-01-01
        • 2018-02-01
        • 2021-10-02
        相关资源
        最近更新 更多