筛选所有行,直到每组中达到最大值



我想在一些测试中过滤一个有很多用户尝试的数据帧。我已经根据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 |

这应该有效:

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

因为:

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

最新更新