如何移除DataFrame中两列的双向重复关联行?
解决DataFrame中双向关联重复行的问题
你的原代码失效原因是把index列也纳入了排序范围,index是唯一值,导致排序后的每行因为index不同,无法被duplicated()识别为重复项。
以下是几种可行的解决方案:
方法1:基于实体名称生成唯一关联键
通过对每行的name_1和name_2排序,生成一个唯一的关联标识,再根据这个标识去重:
import pandas as pd # 生成排序后的实体对作为唯一键 df['pair_key'] = df.apply(lambda row: tuple(sorted([row['name_1'], row['name_2']])), axis=1) # 保留每个关联对的第一行记录 df_unique = df.drop_duplicates(subset='pair_key', keep='first') # 清理临时生成的键列 df_unique = df_unique.drop('pair_key', axis=1)
方法2:基于文件路径直接判断(更贴合文件处理需求)
因为你最终要处理文件路径,直接用path1和path2生成排序后的键更准确:
df['path_pair'] = df.apply(lambda row: tuple(sorted([row['path1'], row['path2']])), axis=1) df_unique = df.drop_duplicates(subset='path_pair', keep='first').drop('path_pair', axis=1)
方法3:优化你原有的numpy排序方式
只针对关联列(而非整个DataFrame)排序,避免index干扰:
import numpy as np # 仅对name_1和name_2列进行排序 sorted_name_pairs = np.sort(df[['name_1', 'name_2']].values, axis=1) # 转换为DataFrame后判断重复,过滤原表 df_unique = df[~pd.DataFrame(sorted_name_pairs).duplicated()]
处理后,原表中的双向关联行(比如0和1、2和3、4和6等)只会保留第一行,后续你就可以安全地用df_unique['path2']中的路径删除对应文件,不会重复处理。
内容的提问来源于stack exchange,提问作者Reut
相关产品推荐
相关产品推荐

