【问题标题】:Getting max row from multi-index table从多索引表中获取最大行
【发布时间】:2021-10-29 09:50:35
【问题描述】:

我有一张类似这样的表格:

user_id date count
1 2020 5
2021 7
2 2017 1
3 2020 2
2019 1
2021 3

我试图只保留每个 user_id 计数最多的行,所以它应该看起来像这样:

user_id date count
1 2021 7
2 2017 1
3 2021 3

我尝试使用 df.groupby(level=0).apply(max) 但它会从决赛表中删除日期列,我不确定如何修改它以保留所有三个原始列

【问题讨论】:

标签: python pandas


【解决方案1】:

您可以尝试在.groupby() 之后仅指定列count,然后使用.apply() 来生成布尔系列是否当前组中的条目等于组中的最大值count。然后,使用.loc 定位布尔序列并显示整个数据框。

df.loc[df.groupby(level=0)['count'].apply(lambda x: x == x.max())]

结果:

         date  count
user_id             
1        2021      7
2        2017      1
3        2021      3

请注意,如果一个user_id 中有多个条目具有相同的最大计数,则将保留所有这些条目。

如果您希望每个user_id 只保留一个条目,那么对于此类数量最多的多个条目,您可以改用以下逻辑:

df1 = df.reset_index()
df1.loc[df1.groupby('user_id')['count'].idxmax()].set_index('user_id')

结果:

         date  count
user_id             
1        2021      7
2        2017      1
3        2021      3

请注意,我们不能简单地使用df.loc[df.groupby(level=0)["count"].idxmax()],因为user_id 是行索引。此代码仅为您提供所有未过滤的行,就像未处理的原始数据帧一样。这是因为idxmax() 在此代码中返回的索引是user_id 本身(而不是简单的 RangeIndex 0、1、2 等)。然后,当.loc 找到这些user_id 索引时,它会简单地返回同一user_id 下的所有 个条目。

演示

让我们在示例数据中添加更多条目,看看两种解决方案之间的区别:

我们的基础dfuser_id 是行索引):

         date  count
user_id             
1        2018      7                 <=== max1
1        2020      5
1        2021      7                 <=== max2
2        2017      1
3        2020      3                 <=== max1
3        2019      1
3        2021      3                 <=== max2

第一个解决方案结果:

df.loc[df.groupby(level=0)['count'].apply(lambda x: x == x.max())]


         date  count
user_id             
1        2018      7
1        2021      7
2        2017      1
3        2020      3
3        2021      3

第二解结果:

df1 = df.reset_index()
df1.loc[df1.groupby('user_id')['count'].idxmax()].set_index('user_id')


         date  count
user_id             
1        2018      7
2        2017      1
3        2020      3

【讨论】:

  • @Ben.T 在这个逻辑中就是这样。让 OP 看看这是否是他/她想要的。
  • @Ben.T 感谢您的评论!我已经编辑了我的答案,以突出显示将提取相同最高计数的多个条目。还提供了只保留一个条目的新解决方案。让 OP 根据他/她的需要进行选择。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-08-04
  • 2017-07-18
  • 1970-01-01
  • 2021-08-06
  • 2022-07-25
  • 2019-02-13
  • 1970-01-01
相关资源
最近更新 更多