如何按复杂条件删除Pandas DataFrame中的重复行?
按特定条件删除Pandas DataFrame重复行
原始DataFrame
idx a b c d e f 1 1 ss1 0 25 A B 2 3 ss7 0 25 A B 3 5 ss5 0 12 C D 4 11 im3 0 12 C D 5 5 ss8 0 50 C K 6 9 im8 0 5 F G 7 8 ix6 0 5 F G
重复行定义与保留规则
- 重复判定:当
d、e、f三列值完全匹配时,视为重复行(对应subset=['d', 'e', 'f']) - 保留规则:
- 若重复行的
b列均以ss开头,任意删除一行 - 若重复行中一个
b列以ss开头、另一个不是,保留ss开头的行 - 若重复行的
b列都不以ss开头,任意保留一行
- 若重复行的
解决方案代码
import pandas as pd # 构建原始数据 data = { 'idx': [1,2,3,4,5,6,7], 'a': [1,3,5,11,5,9,8], 'b': ['ss1','ss7','ss5','im3','ss8','im8','ix6'], 'c': [0,0,0,0,0,0,0], 'd': [25,25,12,12,50,5,5], 'e': ['A','A','C','C','C','F','F'], 'f': ['B','B','D','D','K','G','G'] } df = pd.DataFrame(data) # 标记b列是否以ss开头 df['is_ss'] = df['b'].str.startswith('ss') # 分组排序后保留目标行:优先保留ss开头的,无则任意留一行 result = df.sort_values('is_ss', ascending=False).groupby(['d','e','f'], as_index=False).last() # 清理辅助列并按原始idx排序 result = result.drop('is_ss', axis=1).sort_values('idx') print(result)
预期输出
idx a b c d e f 2 3 ss7 0 25 A B 3 5 ss5 0 12 C D 5 5 ss8 0 50 C K 7 8 ix6 0 5 F G
内容的提问来源于stack exchange,提问作者sam_alloy
相关产品推荐
相关产品推荐

