如何优雅地按两列(顺序无关)合并Pandas DataFrame?
简洁实现双向配对的DataFrame合并
这个问题我之前也碰到过,核心就是要处理无序的配对匹配——不管两个id的顺序是(A,B)还是(B,A),都要视为同一组进行匹配。不用搞反转列再拼接的繁琐操作,用Pandas结合Numpy的排序就能轻松搞定,代码简洁又高效!
核心思路
把每一组id对(不管顺序)转换成统一的无序标识,比如将(Ben, Julie)和(Julie, Ben)都转换成排序后的元组(Ben, Julie),这样两个DataFrame就能通过这个统一标识直接合并。
完整实现代码
import pandas as pd import numpy as np # 初始化原始DataFrame test1 = pd.DataFrame({'id_A':['Ben', 'Julie', 'Jack', 'Jack'], 'id_B':['Julie', 'Ben', 'Nina', 'Julie']}) test2 = pd.DataFrame({'id_a':['Ben', 'Ben', 'Ben', 'Julie', 'Julie', 'Nina'], 'id_b':['Julie', 'Nina', 'Jack', 'Nina', 'Jack', 'Jack'], 'value':[1,1,0,0,1,0]}) # 为两个DataFrame生成无序配对的统一键(排序后的元组) test1['pair_key'] = list(map(tuple, np.sort(test1[['id_A', 'id_B']], axis=1))) test2['pair_key'] = list(map(tuple, np.sort(test2[['id_a', 'id_b']], axis=1))) # 根据统一键合并,提取需要的列 final_df = test1.merge(test2, on='pair_key')[['id_A', 'id_B', 'value']] # 查看结果 print(final_df)
输出验证
运行后得到的结果完全符合你的需求:
id_A id_B value 0 Ben Julie 1 1 Julie Ben 1 2 Jack Nina 0 3 Jack Julie 1
为什么这个方法更好?
- 代码简洁:不需要创建反转列的中间DataFrame,也不用多次合并后再去重/填充,逻辑一目了然。
- 效率更高:用
np.sort替代apply(sorted),处理大数据量时速度更快(Numpy的向量化操作比Pandas的apply高效得多)。 - 扩展性强:如果后续需要处理更多列的无序匹配,只需要调整排序的列列表即可。
内容的提问来源于stack exchange,提问作者sacuL
相关产品推荐
相关产品推荐

