Равенство Pandas DataFrame — нумерация индексов

Имеет ли значение нумерация индексов при проверке равенства кадров данных? У меня есть 2 идентичных фрейма данных с точно такими же данными и столбцами. Единственное отличие состоит в том, что номера индексов для каждой строки разные, и методы equals возвращают False. Как я могу обойти это? Вот мои кадры данных

   A   B
0  87  54
1  87  75
2  87  22
3  87  69

     A   B
418  87  69
107  87  54
108  87  75
250  87  22

person karmanaut    schedule 19.10.2015    source источник
comment
Возможный дубликат Pandas DataFrames со сравнением равенства NaN   -  person hellpanderr    schedule 20.10.2015


Ответы (1)


Вы можете использовать np.array_equal для проверки значений, однако порядок важен, поэтому в вашем примере вам нужно сначала отсортировать по индексу.

In [11]: df1
Out[11]:
    A   B
0  87  54
1  87  75
2  87  22
3  87  69

In [12]: df2
Out[12]:
      A   B
418  87  69
107  87  54
108  87  75
250  87  22

In [13]: df3 = df2.sort()

In [14]: df3
Out[14]:
      A   B
107  87  54
108  87  75
250  87  22
418  87  69

In [15]: np.array_equal(df1, df3)
Out[15]: True

Примечание. Вы не можете сравнивать df1 и df2, так как у них разные индексы:

In [21]: df1 == df2
ValueError: Can only compare identically-labeled DataFrame object

Вы можете сбросить индекс, но имейте в виду, что по этой причине может быть возбуждено исключение:

In [22]: df3.reset_index(drop=True)
Out[22]:
    A   B
0  87  54
1  87  75
2  87  22
3  87  69

In [23]: np.all(df1 == df3.reset_index(drop=True))
Out[23]: True

Другой вариант — попытаться заблокировать блок вокруг assert_frame_equals:

In [24]: pd.util.testing.assert_frame_equal(df1, df3.reset_index(drop=True))

как в этом связанном ответе.

Как указывает Джефф, вы можете использовать .equals, который делает следующее:

In [25]: df1.equals(df3.reset_index(drop=True))
Out[25]: True
person Andy Hayden    schedule 19.10.2015
comment
check_names=False по какой-то причине здесь не работает. Идея с сортировкой хороша! Я пробую их и опубликую обновление (и приму ваш ответ) - person karmanaut; 20.10.2015
comment
check_names проверяет имена индексов, я думаю, что не должно влиять на ваш случай, поскольку у вас нет имен индексов. - person Andy Hayden; 20.10.2015
comment
О, вы хотели использовать assert после сброса индекса? Это не работает без удаления индекса. - person karmanaut; 20.10.2015
comment
@AndyHayden у нас уже давно .equals(...) :) - person Jeff; 20.10.2015
comment
@Джефф не уверен, как я пропустил это при завершении табуляции ранее! :) - person Andy Hayden; 20.10.2015