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

如何基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 22:01:01