Python中按特定ID组删除重复Salary行(保留最后一条)
Pandas按组保留特定Salary值最后一行的实现方法
问题说明
现有如下Pandas数据集:
# 导入依赖库 import pandas as pd # 创建数据集 data = {'id': [1, 1, 1, 1, 1,1, 1, 1, 1, 1,1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2,2,2,2,2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3], 'Salary': [7, 7, 7, 7, 7,7,7,8,9,10,11,12,13,14,15, 4, 4, 4,4,5,6,7,8,9,10, 8, 8, 8, 8,8,8,8,8,9,10,11,12,13], 'Children': ['No', 'Yes', 'Yes', 'Yes', 'No', 'Yes', 'Yes', 'Yes', 'Yes', 'No','No', 'Yes', 'Yes', 'Yes', 'No', 'Yes', 'Yes', 'No', 'Yes', 'Yes', 'Yes', 'Yes', 'Yes', 'Yes', 'No', 'Yes', 'Yes', 'No', 'Yes', 'No', 'Yes', 'Yes', 'No','Yes', 'Yes', 'No','No', 'Yes'], 'Days': [123, 128, 66, 120, 141,123, 128, 66, 120, 141, 52,96, 120, 141, 52, 96, 120,120, 141, 52,96,128, 66, 120, 141, 120, 141,123,15,85,36,58,89,123, 128, 66, 120, 141], } # 转为DataFrame df = pd.DataFrame(data) print("原始数据:\n", df)
需要实现的规则:
- 对
id=1的组,删除所有Salary=7的行,仅保留最后一条 - 对
id=2的组,删除所有Salary=4的行,仅保留最后一条 - 对
id=3的组,删除所有Salary=8的行,仅保留最后一条
实现方案
可以通过拆分数据-分别处理-合并结果的方式高效完成,代码如下:
# 定义每个id对应的目标Salary值 salary_rules = {1: 7, 2: 4, 3: 8} # 1. 筛选出不需要处理的行:Salary不属于对应id的目标值 non_target_rows = df[~df.apply(lambda row: row['Salary'] == salary_rules.get(row['id']), axis=1)] # 2. 筛选出需要处理的行,按id和Salary分组后只保留每组最后一行 target_rows = df[df.apply(lambda row: row['Salary'] == salary_rules.get(row['id']), axis=1)] \ .groupby(['id', 'Salary']) \ .last() \ .reset_index() # 3. 合并两部分数据,并按原索引排序 result_df = pd.concat([non_target_rows, target_rows]).sort_index() # 查看结果 print("处理后的数据:\n", result_df)
方案说明
- 拆分数据:把数据集分成两类,一类是不需要去重的普通行,一类是需要保留最后一行的目标行
- 处理目标行:对目标行按
id和Salary分组,用groupby().last()直接获取每组的最后一条记录 - 合并结果:把普通行和处理后的目标行合并,再按原索引排序,保证数据顺序和原表一致
验证结果
处理后的数据中:
id=1组仅保留最后一条Salary=7的行,其余Salary=7的行被删除id=2组仅保留最后一条Salary=4的行,其余Salary=4的行被删除id=3组仅保留最后一条Salary=8的行,其余Salary=8的行被删除
其他行均完整保留。
内容的提问来源于stack exchange,提问作者NN_Developer
相关产品推荐
相关产品推荐

