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

基于唯一ID比对列名、顺序不同的两个DataFrame多列字段值

Pandas 基于主键比对两个异名、乱序DataFrame的字段差异

核心逻辑无需对齐两个表的行顺序,先统一语义对应的列名,再通过主键关联合并,逐字段校验取值一致性即可,具体实现步骤如下:

  • 先梳理两边的列对应关系
    • 关联主键:df1的id列 对应 df2的newId列
    • 待比对字段:df1的student列对应df2的student1列,df1的marks列对应df2的marks1列
  • 统一列名,把df2的列重命名为和df1一致的标准命名,减少后续比对的冗余代码
import pandas as pd

# 配置列映射:键为df2的原始列名,值为对应df1的标准列名
col_map = {
    "newId": "id",
    "student1": "student",
    "marks1": "marks"
}
df2_std = df2.rename(columns=col_map)
  • 按主键关联合并两个表,给来自不同表的同名字段加来源后缀做区分
# 内连接只保留两边都存在的id,若要检查单边缺失的id,可将how改为'outer'
merged = pd.merge(
    df1,
    df2_std,
    on="id",
    how="inner",
    suffixes=("_source1", "_source2")
)
  • 逐字段标记差异,筛选出不一致的记录
# 指定需要校验的字段列表
check_cols = ["student", "marks"]

# 为每个字段生成差异标记列
for col in check_cols:
    merged[f"{col}_diff"] = merged[f"{col}_source1"] != merged[f"{col}_source2"]

# 提取任意字段存在差异的行
diff_result = merged[merged[[f"{c}_diff" for c in check_cols]].any(axis=1)]

针对给出的示例数据,最终输出的差异结果会精准定位到id=2的记录:该id下marks字段在df1中取值为21,在df2中取值为23,其余记录字段完全一致。

常见场景调整

  • 浮点型数值比对:直接用!=容易被精度误差干扰,可替换为numpy.isclose()设置允许的误差范围做比对
  • 缺失主键排查:merge时使用how='outer'后,只要任意来源表的非主键字段为空,就说明该id只在单边表存在
  • 轻量化差异报告:可遍历差异行,直接输出「id+字段名+df1取值+df2取值」的结构化结果,方便后续核对修正

内容的提问来源于stack exchange,提问作者Nitish N Banakar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 20:30:45