您可以尝试在.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 下的所有 个条目。
演示
让我们在示例数据中添加更多条目,看看两种解决方案之间的区别:
我们的基础df(user_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