【问题标题】:pandas groupby & lambda function to return nlargest(2)pandas groupby & lambda 函数返回 nlargest(2)
【发布时间】:2020-11-20 12:01:32
【问题描述】:

请看pandas df:

pd.DataFrame({'id': [1, 1, 2, 2, 2, 3],
            'pay_date': ['Jul1', 'Jul2', 'Jul8', 'Aug5', 'Aug7', 'Aug22'],
             'id_ind': [1, 2, 1, 2, 3, 1]})

我正在尝试按“id”和“pay_date”分组。在按“id”和“pay_date”分组后,我只想将 df['id_ind'].nlargest(2) 保留在数据框中。这是我的代码:

df = pd.DataFrame(df.groupby(['id', 'pay_date'])['id_ind'].apply(
lambda x: x.nlargest(2)).reset_index()

这不起作用,因为新的 df 返回所有记录。如果有效,'id'==2 只会在 df 中出现两次,因为有 3 条记录,我只想要 'id_ind' 最大的 2 条记录。

我想要的输出:

pd.DataFrame({'id': [1, 1, 2, 2, 3],
        'pay_date': ['Jul1', 'Jul2', 'Aug5', 'Aug7', 'Aug22'],
         'id_ind': [1, 2, 2, 3, 1]})

【问题讨论】:

  • 是的,它返回每个组中最大的两个,在这种情况下是所有记录。你想要的输出是什么?
  • 不行,看看'id'==2,那个组里有3条记录。
  • 是的....但是您按id 分组 pay_date,所以有3个不同的组id == 2
  • 好吧,那是有道理的。那我如何得到我想要的输出呢?我想要的是对'id'进行分组并取2个最大的'id_ind'。但我也想在新的 df 中包含“pay_date”。
  • 我想要的输出:pd.DataFrame({'id': [1, 1, 2, 2, 3], 'pay_date': ['Jul1', 'Jul2', 'Aug5', 'Aug7', 'Aug22'], 'id_ind': [1, 2, 2, 3, 1]}) 请参阅更新的 OP。

标签: python python-3.x pandas lambda pandas-groupby


【解决方案1】:

排序id_ind 并执行groupby.tail

df_final = (df.sort_values('id_ind').groupby('id').tail(2)
                                    .sort_index()
                                    .reset_index(drop=True))

Out[29]:
   id  id_ind pay_date
0   1       1     Jul1
1   1       2     Jul2
2   2       2     Aug5
3   2       3     Aug7
4   3       1    Aug22

【讨论】:

  • 这太聪明了!谢谢!
  • @MichaelMathewsJr.:不客气。快乐编码:)
猜你喜欢
  • 2017-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-04
  • 2018-06-19
  • 1970-01-01
  • 2021-07-19
相关资源
最近更新 更多