为何两个结构外观一致的DataFrame调用equals返回False但compare无差异
可能的原因列表
- 数据类型不一致
pandas的equals方法会严格对比每一列的数据类型,而compare默认仅对比值的内容,不校验类型差异,这是最常见的诱因。典型场景包括:- 从数据库读出的整数列是
Int64(pandas可空整数类型),写入CSV再读出后变成float64或object类型,即便值完全一致,类型差异也会导致equals返回False - 分类列
CategoricalDtype写入CSV后被转为普通字符串/数字类型,类型不匹配 - 带时区的
DatetimeIndex或datetime列写入CSV时丢失时区信息,读回后变为无时区的datetime类型,类型不一致
- 从数据库读出的整数列是
- 浮点数精度丢失
CSV是文本存储格式,写入浮点数时默认仅保留6位有效数字,若原始数据存在更高精度的小数位,写入CSV再读回后会出现极微小的数值差异。equals要求浮点数完全相等,而compare默认的比较阈值atol=1e-08可能会忽略这类极小差异,导致无对比结果输出。 - 空值类型不匹配
原始DataFrame中可能存在pd.NA、None、数据库原生空值等不同类型的空标记,写入CSV再读回后统一被转为np.nan,不同空类型的差异会被equals识别为不一致,但compare会将所有空值判定为相等,无差异输出。 - 索引/列名的类型不匹配
如果原始DataFrame的列名/索引是整数、数值类型,写入CSV后读回时会默认被解析为字符串类型,比如原列名是1,2,3(int类型),读回后变成'1','2','3'(str类型),值看起来完全一致,但类型差异会导致equals返回False。 - 元数据属性差异
equals还会对比DataFrame的部分元数据属性,比如索引的名称、多级索引的层级名称、列的注释属性等,如果写入CSV的过程中丢失了这类元数据,也会导致equals返回False,而compare不会校验这类属性。
内容的提问来源于stack exchange,提问作者neutralname
相关产品推荐
相关产品推荐

