2013-08-31 4 views
14

I Pandas bin mit den Ausgängen von zwei Dateien in zwei Datenrahmen (uat, prod) geladen vergleichen: ...Pandas „Kann nur vergleichen identisch markierten Dataframe-Objekte“ Fehler

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 

Für Beim dritten Druck erhalte ich einen Fehler: Kann nur identisch beschriftete DataFrame-Objekte vergleichen. Wenn die ersten beiden im Vergleich gut, was ist los mit dem 3.?

Dank

Antwort

20

Hier ist ein kleines Beispiel, dies zu demonstrieren (die nur auf Datenrahmen angewendet wird, nicht Serie, bis Pandas 0,19, wo es gilt für beide):

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 

Eine Lösung sort the index erste ist (Hinweis: some functions require sorted indexes):

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

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

Hinweis: == ist auch sensitive to the order of columns, so dass Sie 012.392 verwenden müssen können:

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 

Hinweis: Dies kann noch erhöhen (wenn die Index/Spalten werden nach der Sortierung nicht identisch bezeichnet).

+0

Die Art Link wird gebrochen. Bitte korrigiere es. –

+0

@ShreyashSSarnayak danke, entfernte Verweis auf 'sort' es ist jetzt von Pandas entfernt (ersetzt mit nur' sort_index')! –

10

Sie können auch versuchen, die Indexspalte fallen, wenn es nicht zu vergleichen gebraucht wird:

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

ich diese Technik in einem Gerät zu testen, wie so verwendet haben:

from pandas.util.testing import assert_frame_equal 

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