首页 > 解决方案 > Pandas df.equals() 在相​​同的数据帧上返回 False?

问题描述

df_1df_2成为:

In [1]: import pandas as pd
   ...: df_1 = pd.DataFrame({'a': [1, 2, 3], 'b': [4, 5, 6]})
   ...: df_2 = pd.DataFrame({'a': [1, 2, 3], 'b': [4, 5, 6]})

In [2]: df_1
Out[2]:
   a  b
0  1  4
1  2  5
2  3  6

r我们添加一行df_1

In [3]: r = pd.DataFrame({'a': ['x'], 'b': ['y']})
   ...: df_1 = df_1.append(r, ignore_index=True)

In [4]: df_1
Out[4]:
   a  b
0  1  4
1  2  5
2  3  6
3  x  y

我们现在删除添加的行并再次df_1获取原始行:df_1

In [5]: df_1 = pd.concat([df_1, r]).drop_duplicates(keep=False)

In [6]: df_1
Out[6]:
   a  b
0  1  4
1  2  5
2  3  6

In [7]: df_2
Out[7]:
   a  b
0  1  4
1  2  5
2  3  6

df_1df_2相同时,equals()返回False

In [8]: df_1.equals(df_2)
Out[8]: False

对 SO 进行了研究,但找不到相关问题。我做错了吗?在这种情况下如何得到正确的结果? (df_1==df_2).all().all()返回True但不适合df_1df_2有不同长度的情况。

标签: pythonpandasdataframeequalsdtype

解决方案


这又是一个微妙的,很好地发现它。

import pandas as pd
df_1 = pd.DataFrame({'a': [1, 2, 3], 'b': [4, 5, 6]})
df_2 = pd.DataFrame({'a': [1, 2, 3], 'b': [4, 5, 6]})
r = pd.DataFrame({'a': ['x'], 'b': ['y']})
df_1 = df_1.append(r, ignore_index=True)
df_1 = pd.concat([df_1, r]).drop_duplicates(keep=False)
df_1.equals(df_2)

from pandas.util.testing import assert_frame_equal
assert_frame_equal(df_1,df_2)

现在我们可以看到断言失败的问题。

AssertionError: Attributes of DataFrame.iloc[:, 0] (column name="a") are different

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

当您将字符串添加到整数时,整数变成了对象。所以这就是equals失败的原因..


推荐阅读