pandas: .equals 应该计算为 True?

pandas: .equals should evaluate to True?

我有 2 个 pandas DataFrames 看起来完全一样。但是,当我使用 .equals 方法进行测试时,我得到 False。知道潜在的不一致可能是什么吗?有什么我没有检查的吗?

print(df1.values.tolist()==df2.values.tolist())
print(df1.columns.tolist()==df2.columns.tolist())
print(df1.index.tolist()==df2.index.tolist())
print(df1.equals(df2))

# True
# True
# True
# False

一种可能性是在 python-space 中评估为相等的不同数据类型,例如

df1 = pd.DataFrame({'a': [1, 2.0, 3]})

df2 = pd.DataFrame({'a': [1,2,3]})

df1.values.tolist() == df2.values.tolist()
Out[45]: True

df1.equals(df2)
Out[46]: False

要追踪这个,你可以使用assert_frame_equal函数。

from pandas.testing import assert_frame_equal

assert_frame_equal(df1, df2)
AssertionError: Attributes are different

Attribute "dtype" are different
[left]:  float64
[right]: int64

0.20.1 之前的 pandas 版本中,导入是 from pandas.util.testing import assert_frame_equal