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

如何比较两个pandas DataFrame并提取DF2中缺失或与DF1不一致的记录

基于Pandas的实现方案

我们可以拆分需求为两个独立逻辑分别筛选结果,再合并输出:

  • 第一类:DF1存在但DF2缺失主键的记录,直接取DF1的对应行
  • 第二类:主键一致但非主键字段值不同的记录,取DF2的对应行

完整代码示例

import pandas as pd

# 构造示例数据
df1 = pd.DataFrame({
    'id': [1,2,3],
    'Name': ['Lewis', 'Fred', 'Amy'],
    'Age': [65,35,16]
})
df2 = pd.DataFrame({
    'id': [1,2],
    'Name': ['Lewis', 'Fred'],
    'Age': [65,36]
})

# 步骤1:按主键id左连接两个表,用后缀区分来源字段
merged = df1.merge(df2, on='id', how='left', suffixes=('_df1', '_df2'))

# 步骤2:筛选DF1有、DF2无的记录,取DF1的字段值
missing_in_df2 = merged[merged['Name_df2'].isna()][['id', 'Name_df1', 'Age_df1']]
missing_in_df2.columns = ['id', 'Name', 'Age']

# 步骤3:筛选主键一致但字段值不同的记录,取DF2的字段值
diff_value = merged[
    (merged['Name_df2'].notna()) & 
    ((merged['Name_df1'] != merged['Name_df2']) | (merged['Age_df1'] != merged['Age_df2']))
][['id', 'Name_df2', 'Age_df2']]
diff_value.columns = ['id', 'Name', 'Age']

# 步骤4:合并两类结果
result = pd.concat([diff_value, missing_in_df2], ignore_index=True)
print(result)

输出结果

运行上述代码会得到和你预期完全一致的结果:

id  Name  Age
0   2  Fred   36
1   3   Amy   16

如果你的表字段较多,可以批量生成非主键字段的对比条件,不需要手动逐个写判断逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 10:12:02