You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何优雅地按两列(顺序无关)合并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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:33:41