如何在Pandas中删除分组后目标列最大值小于阈值的所有对应行
解决方法:保留分组后最大值达标的用户全量数据
需求说明
现有Pandas DataFrame包含Name(姓名)和Cumulative items bought(累计购买物品数量)两列,需要删除所有按姓名分组后,该用户累计购买最大值小于10的姓名对应的全部行。
示例数据:
| Name | Cumulative items bought |
|---|---|
| Nick | 2 |
| Nick | 7 |
| Nick | 11 |
| Jason | 3 |
| Jason | 5 |
| Kyle | 2 |
| Kyle | 7 |
| Kyle | 9 |
目标是保留Nick的全部行,删除Jason和Kyle的所有行。
错误代码分析
你尝试的代码:
df.drop(df[df['Cumulative items bought'] < 10].index)
逻辑错误在于:它是直接删除单条记录中累计购买数小于10的行,而非按用户分组判断最大值。执行后会删掉Nick的前两行(2、7),仅保留11那行,同时删掉Jason、Kyle的所有行,完全不符合你要保留用户全量行的需求。
正确解法
方法1:用transform生成分组最大值列后筛选
# 为每行添加对应用户的累计购买最大值 df['user_max'] = df.groupby('Name')['Cumulative items bought'].transform('max') # 筛选出最大值≥10的行,再移除临时列 df_result = df[df['user_max'] >= 10].drop('user_max', axis=1)
方法2:先获取有效姓名列表再筛选
# 计算每个用户的累计购买最大值,筛选出最大值≥10的姓名 valid_users = df.groupby('Name')['Cumulative items bought'].max().loc[lambda x: x >= 10].index # 保留Name在有效列表中的所有行 df_result = df[df['Name'].isin(valid_users)]
两种方法执行后,都会得到仅保留Nick全部3行的结果,符合需求。
内容的提问来源于stack exchange,提问作者LazyTurtle
相关产品推荐
相关产品推荐

