Python DataFrame自定义去重:按规则保留指定优先级数据
Python DataFrame 按规则去重实现
需求说明
需要对DataFrame执行两项去重规则:
- 规则1:当Name、math、physics字段值完全相同时(仅quarter不同),保留最后一行(如Jack的两行仅保留2Q记录)
- 规则2:当David的行与其他行的math、physics字段值相同时,删除David的所有对应行
完整代码实现
import pandas as pd # 构造输入DataFrame data = [ ['Jack', '1Q', 90, 100], ['Jack', '2Q', 90, 100], ['Kevin', '1Q', 45, 20], ['David', '1Q', 15, 60], ['Adam', '1Q', 15, 60], ['David', '2Q', 40, 75], ['Adam', '2Q', 40, 75] ] df = pd.DataFrame(data, columns=['Name', 'quarter', 'math', 'physics']) # 处理规则2:删除与其他行math、physics重复的David行 # 提取非David行的math+physics唯一组合 non_david_combinations = df[df['Name'] != 'David'][['math', 'physics']].drop_duplicates() # 筛选出需要删除的David行 david_to_drop = df[(df['Name'] == 'David') & df[['math', 'physics']].apply(tuple, axis=1).isin(non_david_combinations.apply(tuple, axis=1))] # 删除目标行 df = df.drop(david_to_drop.index) # 处理规则1:按Name、math、physics去重,保留最后一行 df = df.drop_duplicates(subset=['Name', 'math', 'physics'], keep='last') print(df)
代码解释
- 规则2处理:
- 先提取所有非David行的math和physics的唯一组合,锁定需要排查的重复特征
- 筛选出David行中math、physics匹配上述组合的记录,直接删除
- 规则1处理:
- 以
Name、math、physics为分组依据去重,保留每组最后一行(对应不同quarter的最新记录)
- 以
执行结果
Name quarter math physics 1 Jack 2Q 90 100 2 Kevin 1Q 45 20 4 Adam 1Q 15 60 6 Adam 2Q 40 75
内容的提问来源于stack exchange,提问作者tslee
相关产品推荐
相关产品推荐

