Причудливое поведение панд. DataFrame.equals - PullRequest
0 голосов
/ 19 сентября 2018

Я заметил причудливую вещь.Допустим, А и В - это датафреймы.

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

Как мы видим выше, элементы под столбцом a в A и B отличаются, но 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.Согласно контракту панд. DataFrame.equals , 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

в формате 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 голосов
/ 19 сентября 2018

Как и в ответе, который вы указали в своем вопросе, по сути, поведение pandas.DataFrame.equals имитирует numpy.array_equal.Документы для np.array_equal утверждают, что он возвращает:

Истина, если два массива имеют одинаковую форму и элементы, в противном случае - значение False.

Что удовлетворяет ваши два кадра данных.

0 голосов
/ 19 сентября 2018

Альтернатива ответам sacul и U9-Forward, я провел дополнительный анализ, и похоже, что причина, по которой вы видите True, а не False, как вы и ожидали, может иметь что-то большее в этой строке docs :

Эта функция требует, чтобы элементы имели тот же тип dtype, что и их соответствующие элементы в другой серии или кадре данных.

dataframes

С вышеупомянутыми кадрами данных, когда я запускаю df.equals(), это то, что возвращается:

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

Эти два совпадают с тем, что говорят другие ответы,A и B имеют одинаковую форму и имеют одинаковые элементы, поэтому они одинаковы.Хотя B и C имеют одинаковую форму, но разные элементы, поэтому они не одинаковы.

С другой стороны:

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

Здесь A иD имеют одинаковую форму и одинаковые элементы.Но все равно они возвращаются ложными.Разница между этим случаем и приведенным выше состоит в том, что все dtypes в сравнении совпадают, как сказано в приведенной выше цитате документа.A и D оба имеют dtypes: str, int, str.

0 голосов
/ 19 сентября 2018

Из документов :

Определяет, содержат ли два объекта NDFrame одинаковые элементы.NaN в одном и том же месте считаются равными.

Определяет, содержат ли два объекта NDFrame одинаковые элементы !!!

ELEMNTS невключая КОЛОННЫ

Так вот почему возвращается True

Если вы хотите, чтобы он возвратил false, и проверьте, что столбцы:

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

Вывод:

False
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...