python - Pandas df.equals() 在相同的数据帧上返回 False?
问题描述
让df_1
和df_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_1
和df_2
相同时,equals()
返回False
。
In [8]: df_1.equals(df_2)
Out[8]: False
对 SO 进行了研究,但找不到相关问题。我做错了吗?在这种情况下如何得到正确的结果?
(df_1==df_2).all().all()
返回True
但不适合df_1
和df_2
有不同长度的情况。
解决方案
这又是一个微妙的,很好地发现它。
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失败的原因..
推荐阅读
- c# - 如何仅将表单值发送到电子邮件?
- java - 如何使用可变日期作为数组名称的 JSON - Java / Spring
- python-3.x - 重新解释 Unicode 字符串
- c# - C# 反向 IQueryable
- php - 如果同一个对象实例多次附加到 SplObjectStorage 会发生什么?
- javascript - 在我的烧瓶应用程序中没有出现任何错误,但页面没有使用 render_template 呈现
- php - Laravel 命令和作业之间的关系
- python - 数组列表元素的总和
- flowtype - 禁用可能检查流类型
- javascript - 使用 RequestAnimationFrame 动画 SVG - 消失的元素