如何基于emp ID列对比两个DataFrame识别唯一、非唯一及新增条目
Pandas 双DataFrame按指定键比对实现方案
核心实现基于pandas原生的全外连接能力,通过连接标记直接区分不同来源的记录,无需额外依赖。
前置准备
首先导入pandas库,构造样例数据:
import pandas as pd # 第一个待比对DataFrame df1 = pd.DataFrame({ "emp ID": [1, 2], "FirstName": ["Prasanna", "Siva"], "Lastname": ["K", "B"] }) # 第二个待比对DataFrame df2 = pd.DataFrame({ "emp ID": [1, 2, 3], "FirstName": ["Prasana", "Siva", "Karunas"], "Lastname": ["K", "B", "Y"] })
执行全量关联比对
以emp ID作为关联键做全外连接,开启indicator参数自动标记每条记录的来源表:
compare_result = df1.merge( right=df2, on="emp ID", how="outer", indicator=True, suffixes=("_df1", "_df2") )
_merge字段的取值对应三种来源:
left_only:记录仅存在于df1right_only:记录仅存在于df2both:记录在两个表中都存在对应emp ID
分类提取目标条目
三类条目的判定规则:
- 新增条目:仅在df2中存在的记录(即相对df1多出的条目)
- 单表唯一条目:仅在单个表中存在的记录,包含df1独有、df2独有两部分
- 非唯一条目:两个表都存在对应
emp ID的记录,可进一步校验字段值差异
1. 提取新增条目
# 筛选仅在df2存在的记录,清理字段后缀 new_entries = compare_result[compare_result["_merge"] == "right_only"]\ .filter(regex="emp ID|_df2$") new_entries.columns = [col.replace("_df2", "") for col in new_entries.columns]
基于样例数据运行后,会得到emp ID=3的Karunas记录,符合预期。
2. 提取单表唯一条目
# 所有仅在单个表存在的记录 single_table_entries = compare_result[compare_result["_merge"] != "both"] # 如需单独提取df1独有的记录,执行以下代码 df1_only_entries = compare_result[compare_result["_merge"] == "left_only"]\ .filter(regex="emp ID|_df1$") df1_only_entries.columns = [col.replace("_df1", "") for col in df1_only_entries.columns]
3. 提取非唯一条目(含字段差异校验)
# 筛选两表共有的记录 common_entries = compare_result[compare_result["_merge"] == "both"].drop(columns="_merge") # 校验同emp ID下其他字段是否存在值差异 def has_field_diff(row): return (row["FirstName_df1"] != row["FirstName_df2"]) or (row["Lastname_df1"] != row["Lastname_df2"]) common_entries["field_diff"] = common_entries.apply(has_field_diff, axis=1) # 提取存在字段不一致的记录 diff_entries = common_entries[common_entries["field_diff"]]
基于样例数据运行后,emp ID=1的记录会被标记为存在字段差异(FirstName拼写不同),emp ID=2的记录两表完全一致。
内容的提问来源于stack exchange,提问作者Prasanna K
相关产品推荐
相关产品推荐

