如何基于ID列对比同结构DataFrame并提取指定差异行
问题:对比两个DataFrame提取指定差异行
需求说明
对比两个结构相同的DataFrame,基于id列,提取**id和Key的组合仅存在于其中一方**的所有行,并用Flag标记来源(1表示来自DataFrame1,0表示来自DataFrame2)。
原始数据
DataFrame1:
Key id group 100 1 100_1 101 1 101_1 102 1 102_1 100 2 100_2 101 2 101_1 102 2 102_1
DataFrame2:
Key id group 100 1 100_1 101 1 101_1 103 1 103_1 100 2 100_2 101 3 101_3
期望结果
Key id group Flag 102 1 102_1 1 103 1 103_1 0 101 2 101_1 1 102 2 102_1 1 101 3 101_3 0
(注:原期望结果中101 2 101_2为笔误,对应DataFrame1实际数据为101 2 101_1)
已尝试但无效的方法
使用
pd.concat合并去重:df_diff=pd.concat([df1,df2]).drop_duplicates(keep=False)仅返回完全不同的行,无法针对
id+Key的组合差异筛选。左连接:
join = df1.merge(df2.drop_duplicates(),on=['id','key','group'],how='left',indicator=True)连接键包含了
group,会过滤掉group不同但id+Key相同的情况,不符合需求。subtract方法:df1.subtract(df2).show()该方法用于数值运算,不适合提取行级差异。
解决方案
核心思路是把id和Key作为唯一标识,找出两个DataFrame中该标识仅出现一次的行,再标记来源。
完整代码
import pandas as pd # 构造示例数据 df1 = pd.DataFrame({ 'Key': [100, 101, 102, 100, 101, 102], 'id': [1, 1, 1, 2, 2, 2], 'group': ['100_1', '101_1', '102_1', '100_2', '101_1', '102_1'] }) df2 = pd.DataFrame({ 'Key': [100, 101, 103, 100, 101], 'id': [1, 1, 1, 2, 3], 'group': ['100_1', '101_1', '103_1', '100_2', '101_3'] }) # 1. 添加来源标记 df1['Flag'] = 1 df2['Flag'] = 0 # 2. 合并并统计id+Key组合的出现次数 merged = pd.concat([df1, df2]) pair_counts = merged.groupby(['id', 'Key']).size().reset_index(name='count') # 筛选仅出现一次的组合 unique_pairs = pair_counts[pair_counts['count'] == 1][['id', 'Key']] # 3. 匹配得到最终结果 result = merged.merge(unique_pairs, on=['id', 'Key'], how='inner') # 按id和Key排序对齐 result = result.sort_values(['id', 'Key']).reset_index(drop=True) print(result)
输出结果
Key id group Flag 0 102 1 102_1 1 1 103 1 103_1 0 2 101 2 101_1 1 3 102 2 102_1 1 4 101 3 101_3 0
内容的提问来源于stack exchange,提问作者jonie
相关产品推荐
相关产品推荐

