为何Pandas的compare方法对比两个DataFrame时未正常工作?
df.compare()未检测到预期差异的原因 以下是几种常见的排查方向:
数据类型不匹配:两个DataFrame的同名字段数据类型不一致,比如一个是
int64、另一个是float64,或者一个是str、另一个是category。即使数值/内容肉眼看起来完全一致,compare会严格按类型+值的组合判定,类型不同但值等效的情况不会被标记为差异。可以通过df1.dtypes和df2.dtypes输出对比验证。字符串字段含不可见字符:字符串类型的字段中存在空格、换行符、制表符或其他Unicode不可见字符(比如全角空格),肉眼无法区分,但实际属于不同的字符串内容。可以用
df1['列名'].str.strip()和df2['列名'].str.strip()后再对比,或者直接输出字符串的长度来排查。列名/索引存在细微差异:
- 列名大小写不一致(如
"UserID"和"userid")、或带有隐藏空格,导致compare无法匹配对应列,自然检测不到差异; - 索引值类型不同(如一个是整数
123、另一个是字符串"123"),或索引带有不可见字符,即使排序后看起来一致,实际对齐时会匹配失败。可以用df1.columns.equals(df2.columns)和df1.index.equals(df2.index)快速验证列和索引是否完全一致。
- 列名大小写不一致(如
浮点数精度误差:如果是浮点型字段,可能存在二进制存储导致的细微精度差异(比如
0.1在计算后变成0.1000000000001),肉眼无法察觉,但compare默认会精确匹配。可以尝试设置rtol和atol参数放宽精度要求,比如df1.compare(df2, rtol=1e-9),或者将浮点字段转换为定点小数后再对比。compare默认参数限制:compare默认只返回存在差异的行和列(keep_shape=False),如果结果为空,可能让你误以为没有差异,但实际可以通过keep_shape=True参数强制显示所有行,无差异的位置会标记为NaN,方便确认是否真的没有差异:df1.compare(df2, keep_shape=True)重复索引导致对齐错误:如果DataFrame存在重复的索引值,
compare在按索引对齐时可能出现匹配混乱,导致实际存在的差异被掩盖。可以用df1.index.is_unique和df2.index.is_unique检查索引是否唯一。数据被意外修改:在创建两个DataFrame后到执行
compare前,其中一个数据集被意外修改(比如误操作执行了赋值、过滤等操作),导致二者实际已无差异,和你手动核查的原始版本不一致。建议重新加载两份原始数据后再执行对比。
内容的提问来源于stack exchange,提问作者user3486773

