【问题标题】:Filtering all the rows until a max is reached in each group过滤所有行,直到每组达到最大值
【发布时间】:2021-12-11 01:07:52
【问题描述】:

我想过滤一个有许多用户尝试进行某些测试的数据框。我已经根据 ID 和日期对数据框进行了排序。问题是我不知道如何将所有这些行过滤到特定用户的最大值。我想删除每个用户的最大点之后的行。

例如:

| user | score | date                    |
| A    | 5     | 2021-11-14 10:22:13.854 |
| A    | 7     | 2021-11-14 10:25:03.044 |
| B    | 4     | 2021-11-16 19:01:42.005 |
| B    | 7     | 2021-11-16 19:04:21.859 |
| B    | 6     | 2021-11-16 19:06:52.372 |

我想过滤数据框,以便用户 B 只有前两行是过滤器(因为第三行低于该用户的最大值)。

结果是:

| user | score | date                    |
| A    | 5     | 2021-11-14 10:22:13.854 |
| A    | 7     | 2021-11-14 10:25:03.044 |
| B    | 4     | 2021-11-16 19:01:42.005 |
| B    | 7     | 2021-11-16 19:04:21.859 |

【问题讨论】:

  • 您应该将示例数据格式化为表格。将它们放在代码块(或预块)中,以便于阅读。参考文献stackoverflow.com/editing-help 可能还有 stackoverflow.com/editing-help#tables
  • 您的帖子不清楚:您是否可以互换使用这些术语:(ID 和用户)和(点数和分数)。你说的一排比另一排低是什么意思?您是否仅在决定时比较分数值?

标签: python pandas dataframe


【解决方案1】:

这应该可行:

df.groupby('user').apply(lambda g: g.head(g['score'].argmax()+1)).reset_index(drop=True)

因为:

  • 首先,按用户/ID 分组
  • 然后对于每个组,获取最大分数的位置(如果有多个这样的分数,它会选择第一个出现的位置)
  • 并将行返回到该行

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-06-11
    • 1970-01-01
    • 1970-01-01
    • 2020-03-27
    • 1970-01-01
    • 1970-01-01
    • 2016-04-04
    相关资源
    最近更新 更多