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

