pandas.DataFrame.equals的古怪行为

时间:2018-09-19 03:53:07

标签: 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是:

B
   a  b  c
0  1  x  a
1  2  y  b
2  3  z  c
3  4  w  d

如上所述,aAB列下的元素是不同的,但是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吗?另外,我还在SO上研究了该主题。根据{{​​3}},Pandas必须返回False。我将不胜感激。

我是一个初学者,因此,感谢您的帮助。


这里是json格式,而._data是A和B

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._data

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

3 个答案:

答案 0 :(得分:2)

除了sacul和U9-Forward的答案之外,我已经进行了一些进一步的分析,似乎您看到True而不是False的原因与您预期的有关docs的这一行:

  

此功能要求元素与其他Series或DataFrame中的元素具有相同的dtype。

dataframes

使用上述数据框,当我运行df.equals()时,将返回以下内容:

>>> A.equals(B)
Out: True
>>> B.equals(C)
Out: False

这两个与其他答案说的一致:AB的形状相同,具有相同的元素,因此它们也相同。尽管BC的形状相同,但是元素不同,所以它们并不相同。

另一方面:

>>> A.equals(D)
Out: False

此处AD具有相同的形状和相同的元素。但是他们仍然在返回错误。这种情况与上述情况之间的区别在于,比较中的所有dtypes都匹配,正如上面的文档所引用的那样。 AD都具有dtypes:str,int,str。

答案 1 :(得分:1)

来自docs

  

确定两个NDFrame对象是否包含相同的元素。相同位置的NaN被认为是相等的。

确定两个NDFrame对象是否包含相同的元素 !!!!

(不包括

这就是为什么返回True

如果您希望它返回false并检查列,请执行以下操作:

print((A==B).all().all())

输出:

False

答案 2 :(得分:1)

就像您在问题中链接的答案一样,pandas.DataFrame.equals的行为基本上类似于numpy.array_equalnp.array_equal的文档指出它返回:

  

如果两个数组具有相同的形状和元素,则为真,否则为False。

您的2个数据框都满足。