Python pandas.DataFrame.equals的古怪行为
我注意到一件怪事。假设A和B是数据帧 A是:Python pandas.DataFrame.equals的古怪行为,python,pandas,Python,Pandas,我注意到一件怪事。假设A和B是数据帧 A是: A a b c 0 x 1 a 1 y 2 b 2 z 3 c 3 w 4 d B是: 如上所述,在a和B中a列下的元素是不同的,但是a.equals(B)产生True A==B正确地表示元素不相等: A==B a b c 0 False False True 1 False False True 2 False False True 3 False False
A
a b c
0 x 1 a
1 y 2 b
2 z 3 c
3 w 4 d
B是:
如上所述,在a
和B
中a
列下的元素是不同的,但是a.equals(B)
产生True
A==B
正确地表示元素不相等:
A==B
a b c
0 False False True
1 False False True
2 False False True
3 False False True
问题:有人能解释一下为什么.equals()
会产生True
?还有,我就这样研究了这个话题。根据,Pandas
必须返回False
。我非常感谢你的帮助
我是一个初学者,所以我非常感谢任何帮助
下面是A和B的
json
格式和\u数据
A
`A.to_json()`
Out[114]: '{"a":{"0":"x","1":"y","2":"z","3":"w"},"b":{"0":1,"1":2,"2":3,"3":4},"c":{"0":"a","1":"b","2":"c","3":"d"}}'
和A.。\u数据
BlockManager
Items: Index(['a', 'b', 'c'], dtype='object')
Axis 1: RangeIndex(start=0, stop=4, step=1)
IntBlock: slice(1, 2, 1), 1 x 4, dtype: int64
ObjectBlock: slice(0, 4, 2), 2 x 4, dtype: object
B
B的json格式:
B.to_json()
'{"a":{"0":1,"1":2,"2":3,"3":4},"b":{"0":"x","1":"y","2":"z","3":"w"},"c":{"0":"a","1":"b","2":"c","3":"d"}}'
B._data
BlockManager
Items: Index(['a', 'b', 'c'], dtype='object')
Axis 1: RangeIndex(start=0, stop=4, step=1)
IntBlock: slice(0, 1, 1), 1 x 4, dtype: int64
ObjectBlock: slice(1, 3, 1), 2 x 4, dtype: object
从:
确定两个NDFrame对象是否包含相同的元素。同一位置的NAN被认为是相等的
确定两个NDFrame对象是否包含相同的元素
元素不包括列
这就是为什么返回True
如果希望返回false并检查列,请执行以下操作:
print((A==B).all().all())
输出:
False
正如您在问题中所链接的答案一样,pandas.DataFrame.equals的行为本质上是模仿。
np.array_equal
的文档声明它返回:
如果两个数组具有相同的形状和元素,则为True,否则为False
您的两个数据帧满足。替代sacul和U9 Forward的答案,我已经做了一些进一步的分析,看起来您看到True
而不是False
的原因可能与这行代码有更多关系:
此函数要求元素与其他系列或数据帧中各自的元素具有相同的数据类型
对于上述数据帧,当我运行df.equals()
时,返回的是:
>>> A.equals(B)
Out: True
>>> B.equals(C)
Out: False
这两个答案与其他答案一致,A
和B
是相同的形状和元素,因此它们是相同的。而B
和C
具有相同的形状,但元素不同,因此它们不相同
另一方面:
>>> A.equals(D)
Out: False
这里的A
和D
具有相同的形状和元素。但他们仍然返回错误。这种情况与上面的不同之处在于,比较中的所有d类型都匹配,正如上面的文档所引用的那样A
和D
都有D类型
:str,int,str.谢谢sacul。我在https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.equals.html
。我所能找到的就是确定两个NDFrame对象是否包含相同的元素。同一地点的N被认为是相等的。
您能给我指一下正确的方向吗?还有,检查相等性的最佳方法是什么?@watchtower它是:(A==B).all().all()
您还可以查看我链接到numpy.array_equal
的文档,这对它的解释不同,但本质上是相同的函数。至于如何检查相等性,@U9 Forward的评论是有意义的(+1)另请参见:为了进一步澄清:我是说A和B的比较应该返回False,但函数不能正常工作,因为它需要比较like与likedtypes
,因此它错误地返回True。A和D具有匹配的数据类型:str、int、str-因此它们的比较工作正常,并返回False(当两个字符串列切换时)
>>> A.equals(D)
Out: False