Pandas合并DataFrame与其副本时如何避免重复匹配结果
实现方案
核心处理逻辑分为两步:
- 过滤掉
Id_x与Id_y相等的自匹配记录 - 对每条记录的两个Id做排序生成唯一配对标识,基于该标识去重即可消除顺序颠倒的重复配对
- 过滤掉
完整可运行代码示例:
import pandas as pd # 构造示例数据 df1 = pd.DataFrame() df1['Id'] = ['001','002','003','004','005','006'] df1['Tel'] = ['123','456','789','123','852','123'] df2 = df1.copy() df3 = pd.merge(df1, df2, on='Tel', how='inner') # 过滤自匹配记录 df_filter = df3[df3['Id_x'] != df3['Id_y']].copy() # 生成排序后的配对键去重 df_filter['pair_key'] = df_filter.apply(lambda x: tuple(sorted([x['Id_x'], x['Id_y']])), axis=1) df_result = df_filter.drop_duplicates(subset='pair_key').drop(columns='pair_key').reset_index(drop=True) print(df_result)
运行上述代码得到的输出与你期望的结果完全一致:
Id_x Tel Id_y 0 001 123 004 1 001 123 006 2 004 123 006
- 大数据量优化方案:如果数据量较大,
apply方法性能较低,可以改用向量化操作提升效率:
import numpy as np # 替换上述pair_key生成逻辑 df_filter['min_id'] = np.minimum(df_filter['Id_x'], df_filter['Id_y']) df_filter['max_id'] = np.maximum(df_filter['Id_x'], df_filter['Id_y']) df_result = df_filter.drop_duplicates(subset=['min_id', 'max_id']).drop(columns=['min_id', 'max_id']).reset_index(drop=True)
内容的提问来源于stack exchange,提问作者Gustavo A. Marín Acevedo
相关产品推荐
相关产品推荐

