如何基于cust_id分组删除DataFrame中y值较小的行?
解决方案
示例数据
先还原你的数据结构:
| group_id | cust_id | score | x1 | x2 | contract_id | y | |
|---|---|---|---|---|---|---|---|
| 0 | 101 | 1 | 95 | F | 30 | 1 | 30 |
| 1 | 101 | 1 | 95 | F | 30 | 2 | 26 |
| 2 | 101 | 2 | 85 | M | 28 | 1 | 8 |
| 3 | 101 | 2 | 85 | M | 28 | 2 | 18 |
实现方法
要保留每个cust_id下y值最大的行(即删除y较小的行),用Pandas的groupby+idxmax就能快速实现,不需要逐行筛选:
import pandas as pd # 构造数据框(已有数据可跳过此步) df = pd.DataFrame({ 'group_id': [101, 101, 101, 101], 'cust_id': [1, 1, 2, 2], 'score': [95, 95, 85, 85], 'x1': ['F', 'F', 'M', 'M'], 'x2': [30, 30, 28, 28], 'contract_id': [1, 2, 1, 2], 'y': [30, 26, 8, 18] }) # 1. 获取每个cust_id下y值最大的行的索引 max_y_idx = df.groupby('cust_id')['y'].idxmax() # 2. 筛选保留目标行,得到最终结果 result_df = df.loc[max_y_idx]
执行后result_df的输出就是你需要的结果:
| group_id | cust_id | score | x1 | x2 | contract_id | y | |
|---|---|---|---|---|---|---|---|
| 0 | 101 | 1 | 95 | F | 30 | 1 | 30 |
| 3 | 101 | 2 | 85 | M | 28 | 2 | 18 |
直接修改原数据框(删除行)
如果想直接在原数据框上删除目标行,可补充以下代码:
# 计算需要删除的索引 drop_idx = df.index.difference(max_y_idx) # 直接删除行(inplace=True会修改原数据框) df.drop(drop_idx, inplace=True)
原理说明
groupby('cust_id')['y'].idxmax()会按cust_id分组,自动找出每组中y值最大的行的索引,一步完成“按cust_id筛选+找最大y”的核心逻辑。- 用
df.loc[]根据这些索引筛选,就能直接得到保留的行,无需手动逐组判断比较。
内容的提问来源于stack exchange,提问作者Shuai Yue
相关产品推荐
相关产品推荐

