compare方法要求pandas≥1.1.0,低版本报attributeerror;需确保两dataframe索引与列完全对齐,数值类型一致,浮点数需round或改用np.isclose容差比较,nan需fillna统一处理。

compare方法在pandas 1.1.0+才可用,低版本会报AttributeError
如果你的pandas低于1.1.0(比如1.0.5或更早),直接调用df1.compare(df2)会触发AttributeError: 'DataFrame' object has no attribute 'compare'。这不是写法错,是版本硬门槛。
升级是最直接的解法:
pip install --upgrade pandas升级后验证版本:
import pandas as pd; print(pd.__version__)确保输出 ≥
1.1.0。旧项目若不能升级,得改用df1.eq(df2)逐元素比对 + stack()定位差异,但无法原生输出“变更前/后”结构。
必须保证两个DataFrame行列索引完全对齐,否则compare静默丢行/列
compare默认只对比**索引和列名完全一致**的位置。如果df1有索引[0,1,2],df2是[0,1,3],那么索引2和3的行会被自动忽略,不报错也不警告——结果看似“没差异”,实则漏比。
实操前务必检查并统一结构:
- 用
df1.index.equals(df2.index)和df1.columns.equals(df2.columns)确认布尔返回值为True - 若索引不等,先对齐:
df2 = df2.reindex_like(df1)
(注意:这会引入NaN,需结合keep_shape=True参数控制) - 数值类型也建议一致,比如
int64vsfloat64可能导致0 == 0.0为True,但某些场景下你希望视为不同
compare默认只显示不同值,相同值被压缩;用keep_equal=True可保留全量
默认行为是“只汇报差异”,这对查问题很高效,但如果你需要完整对照表(比如生成审计报告),就得显式开启keep_equal=True。此时相同值会以双栏形式重复出现(self和other列值相同)。
另一个关键参数是keep_shape:设为True时,即使某行/列全相同,也会保留空结构;设为False(默认)则直接剔除整行/列。调试时建议先开keep_shape=True,避免误判“没数据=没差异”。
示例调用:
diff = df1.compare(df2, keep_equal=True, keep_shape=True)返回的
diff是MultiIndex列的DataFrame,列名为('colA', 'self')、('colA', 'other')这种二元组,注意后续取列要按层级访问。
数值精度差异(如浮点误差)会导致大量“伪差异”,需预处理
直接比0.1 + 0.2和0.3会因浮点表示不同而标为差异。pandas的compare不做容差判断,它走的是严格相等(==语义)。
解决办法分两层:
- 若数据源可控,在构造
df1/df2时就做round:df1 = df1.round(10); df2 = df2.round(10)
- 若需动态容差,不能依赖
compare,改用numpy.isclose逐列计算布尔矩阵,再用where提取位置:import numpy as np; mask = ~np.isclose(df1, df2, atol=1e-8)
- 注意:
compare对NaN的处理是“NaN != NaN”,所以两个NaN会被标为差异——如果业务上认为它们相等,得提前用fillna()统一替换
真正难的不是调用方法,而是想清楚“什么算差异”:是字节级相等?还是业务意义相等?后者永远需要你在compare之外加一层逻辑。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











