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

如何获取两个Pandas DataFrame的对称差集(异或)?

如何获取两个Pandas DataFrame的对称差集(异或结果)

示例数据与期望结果

首先定义示例数据和期望的输出结果:

import pandas as pd

# 原始DataFrame a
a = pd.DataFrame({'a': [1, 2], 'b': ['x', 'y']})
# 原始DataFrame b
b = pd.DataFrame({'a': [1, 2, 3], 'b': ['x', 'z', '']})
# 期望的对称差集结果
expected_result = pd.DataFrame({'a': [2, 2, 3], 'b': ['y', 'z', ''], 'source': ['a', 'b', 'b']})

原DataFrame a:

a  b
0  1  x
1  2  y

原DataFrame b:

a  b
0  1  x
1  2  z
2  3   

期望输出:

a  b source
0  2  y      a
1  2  z      b
2  3         b

当前的复杂实现

你目前使用的实现逻辑较为繁琐,代码如下:

diff_a = pd.concat([a, b, b]).drop_duplicates(keep=False)
diff_a['source'] = 'a'

diff_b = pd.concat([b, a, a]).drop_duplicates(keep=False)
diff_b['source'] = 'b'

out = pd.concat([diff_a, diff_b]).reset_index(drop=True)

更简洁的实现方案

可以利用Pandas的merge方法结合indicator参数来快速实现对称差集,代码更简洁直观:

# 外连接两个DataFrame,添加_merge列标记行的来源
merged = pd.merge(a, b, on=['a', 'b'], how='outer', indicator=True)

# 筛选出仅存在于a或仅存在于b的行(排除同时存在的行)
symmetric_diff = merged[merged['_merge'] != 'both']

# 将_merge列转换为source列,标记原始来源
symmetric_diff['source'] = symmetric_diff['_merge'].map({'left_only': 'a', 'right_only': 'b'})

# 移除_merge列并重置索引
final_result = symmetric_diff.drop(columns='_merge').reset_index(drop=True)

运行上述代码后,final_result的结果与期望输出完全一致。

内容的提问来源于stack exchange,提问作者aeiou

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 03:40:02