Pandas中df.equals()返回False但df.compare()仅返回空索引列Id,该如何判断?
这种情况说明两个DataFrame的实际数据值完全匹配,但存在元数据或结构层面的差异,导致df1.equals(df2)返回False,而df1.compare(df2)因只对比值的差异,所以返回空结果。
具体可能的差异点及验证方法:
列数据类型不一致:哪怕数值完全相同,不同的数据类型(如
int64vsfloat64,objectvsstring)会让equals()判定不相等,但compare()只校验值是否一致。
验证:执行df1.dtypes和df2.dtypes对比输出。列的顺序不同:
equals()要求列的顺序完全一致才会返回True,而compare()会按列名自动对齐后对比值。如果两DataFrame列名相同但顺序不同,值一致时就会出现这种情况。
验证:执行df1.columns.tolist()和df2.columns.tolist()查看列顺序。索引/列的元数据差异:比如索引的名称存在大小写差异(如
Idvsid)、索引的数据类型不同,或者列的名称有不可见字符(如空格),这些都会触发equals()的不相等判定,但compare()仍能正常按索引/列名匹配对比值。
验证:执行df1.index.name/df2.index.name、df1.index.dtype/df2.index.dtype对比。缺失值的表示类型不同:比如一个DataFrame用
np.nan表示缺失,另一个用pd.NA,equals()会区分这两种缺失值,但compare()在默认配置下会将它们视为等价的缺失。
验证:执行np.array_equal(df1.to_numpy(), df2.to_numpy(), equal_nan=True),如果返回True则说明值层面完全一致。自定义元数据(attrs)不同:如果给DataFrame添加了自定义
attrs属性,equals()会校验这些属性是否一致,而compare()不会涉及这部分校验。
验证:执行print(df1.attrs)和print(df2.attrs)对比。
内容的提问来源于stack exchange,提问作者Moneet

