pandas 1.1.0+ 推荐用 compare() 直接比对,要求索引和列名完全一致,否则需先 reset_index(drop=true) 和 reindex(columns=...) 对齐;旧版可用 concat()+duplicated() 找唯一差异行。

用 compare() 直接生成差异结果(Pandas 1.1.0+)
如果你的 Pandas 版本 ≥ 1.1.0,compare() 是最直接的方式,它会把两表按索引和列对齐后,逐单元格比对,只返回不同值的行列,并标记来源(self 或 other)。
注意:两 DataFrame 必须有完全相同的索引和列名,否则会报 ValueError: Can only compare identically-labeled DataFrame objects。如果索引不一致,先用 reset_index(drop=True) 对齐;列顺序不同就用 reindex(columns=...) 统一。
示例:
df1 = pd.DataFrame({"A": [1, 2], "B": [3, 4]})
df2 = pd.DataFrame({"A": [1, 9], "B": [3, 4]})
diff = df1.compare(df2)
# 输出:
# A
# self other
# 1 2 9
用 concat() + duplicated() 找出唯一差异行(兼容旧版)
适用于 Pandas
关键点是把两个 DataFrame 拼起来,加个标识列,再按所有列去重并筛选出只出现一次的行:
-
keep=False表示标出所有重复项(含非重复项) - 最终用
~duplicated(..., keep=False)取反,得到只属于某一方的行 - 必须确保两表列名、数据类型、空值处理一致,否则
NaN == NaN为False,会导致误判
示例(找 df1 中存在但 df2 中不存在的行):
SkillSub Pro - Python 题解与代码注释双功能技能功能概述SkillSub Pro - Python 题解与代码注释双功能技能是一项面向实际任务的技能,主要用于SkillSub Pro 是一个 Python 题解生成与代码注释的 双功能合体技能 ,专为学生、算法学习者和开发者设计;✅ 一个技能,两种用途 :;核心要点📝 题解模式 :输入题目/题号,自动生成完整 Python 题解(含详细注释、解题思路、复杂度分析);💬 注释模式 :输入 Python 代码,自动添加详细中。它将相关步骤、
combined = pd.concat([df1.assign(src="df1"), df2.assign(src="df2")], ignore_index=True)
mask = ~combined.duplicated(subset=df1.columns.tolist(), keep=False)
diff_only_df1 = combined[mask & (combined["src"] == "df1")].drop("src", axis=1)
用 merge(how="outer") + indicator 找行级增删改
当你需要区分「新增」「删除」「修改」三类变化时,merge(..., indicator=True) 最清晰。它会在结果中加入 _merge 列,值为 both、left_only 或 right_only。
注意:merge 默认按列名匹配,若两表主键列名不同(如 df1 用 "id",df2 用 "user_id"),需显式指定 left_on/right_on;若要检测值是否变化,得在 merge 后手动比较对应列,比如 df_merged["col_changed"] = df_merged["col_x"] != df_merged["col_y"]。
常见陷阱:
- 未设
suffixes=("_left", "_right")导致列名冲突 - 数值精度差异(如 float32 vs float64)导致看似相等的数被判定为不同
- 字符串含不可见字符(\t、\r、全角空格),建议提前用
.str.strip()处理
性能与内存提醒:大表慎用 compare() 和全列 duplicated()
compare() 内部会广播对齐,10 万行 × 100 列的数据可能瞬间吃光几 GB 内存;duplicated() 在全列参与哈希时,若某列是 object 类型且含长文本,哈希开销极大。
实际处理大表时,更稳妥的做法是:
- 先用
df1.equals(df2)快速判断是否完全一致(O(1) 短路) - 按业务主键(如
"order_id")merge,再逐字段对比,避免一次性加载全部列 - 对关键列用
np.array_equal(df1[col], df2[col])检查,比==更快且正确处理 NaN
真正难的不是语法,而是确认你比对的“行”是否真的可比——索引对齐方式、空值约定、时间戳时区、字符串编码,这些细节一旦错位,结果就不可信。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










