已移除自比较行,如何移除Pandas DataFrame中顺序重复的图像比较行?
解决方法
要移除这种顺序重复的比较行,核心思路是给每一对正向/反向的比较生成唯一的无序标识,再基于这个标识去重,以下是两种实用实现方式:
方法1:生成排序后的配对键(高效适配大数据集)
通过将每行的两组标识排序后生成统一键,让正向和反向比较的键完全一致,再按键去重:
# 把(f1,s1)和(f2,s2)分别组合成元组 df['pair_left'] = list(zip(df['f1'], df['s1'])) df['pair_right'] = list(zip(df['f2'], df['s2'])) # 对两个元组排序,生成唯一的无序配对键 df['unique_pair'] = df.apply(lambda row: tuple(sorted((row['pair_left'], row['pair_right']))), axis=1) # 保留每个唯一键对应的第一行,删除中间辅助列 df_dedup = df.drop_duplicates(subset='unique_pair', keep='first').drop(columns=['pair_left', 'pair_right', 'unique_pair'])
方法2:直接比较标识大小(简洁适配小数据集)
利用元组的自然排序特性,只保留(f1,s1)小于(f2,s2)的行,直接过滤掉反向重复项:
# 通过元组比较筛选,只保留单向配对行 df_dedup = df[df.apply(lambda row: (row['f1'], row['s1']) < (row['f2'], row['s2']), axis=1)]
补充说明
- 如果需要保留反向配对而非正向,只需把方法2中的
<改为>,或者方法1中的keep='first'改为keep='last'。 - 方法1通过预先生成唯一键,在大数据集上的运行效率优于方法2的逐行apply。
内容的提问来源于stack exchange,提问作者aaa
相关产品推荐
相关产品推荐

