如何获取两个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
相关产品推荐
相关产品推荐

