Pandas "Может сравнивать только объекты с идентичной меткой DataFrame"

Я использую Pandas для сравнения выходов двух файлов, загружаемых в два кадра данных (uat, prod): ...

uat = uat[['Customer Number','Product']]
prod = prod[['Customer Number','Product']]
print uat['Customer Number'] == prod['Customer Number']
print uat['Product'] == prod['Product']
print uat == prod

The first two match exactly:
74357    True
74356    True
Name: Customer Number, dtype: bool
74357    True
74356    True
Name: Product, dtype: bool

Для третьей печати я получаю сообщение об ошибке: Может сравнивать только идентичные объекты DataFrame. Если первые два сравниваются отлично, что неправильно с третьим?

Спасибо

Ответ 1

Вот небольшой пример, чтобы продемонстрировать это (который применяется только к DataFrames, а не к серии, до Pandas 0,19, где он применяется к обоим):

In [1]: df1 = pd.DataFrame([[1, 2], [3, 4]])

In [2]: df2 = pd.DataFrame([[3, 4], [1, 2]], index=[1, 0])

In [3]: df1 == df2
Exception: Can only compare identically-labeled DataFrame objects

Одним из решений является сначала сортировать индекс (Примечание: для некоторых функций требуются отсортированные индексы):

In [4]: df2.sort_index(inplace=True)

In [5]: df1 == df2
Out[5]: 
      0     1
0  True  True
1  True  True

Примечание: == также чувствителен к порядку столбцов, поэтому вам может потребоваться использовать sort_index(axis=1):

In [11]: df1.sort_index().sort_index(axis=1) == df2.sort_index().sort_index(axis=1)
Out[11]: 
      0     1
0  True  True
1  True  True

Примечание. Это может по-прежнему повышаться (если индекс/столбцы не идентифицируются идентично после сортировки).

Ответ 2

Вы также можете попробовать удалить столбец индекса, если это не нужно сравнивать:

print(df1.reset_index(drop=True) == df2.reset_index(drop=True))

Я использовал эту же технику в unit test так:

from pandas.util.testing import assert_frame_equal

assert_frame_equal(actual.reset_index(drop=True), expected.reset_index(drop=True))