2013-08-31 18 views
14

sto usando Panda per confrontare le uscite di due file caricati in due frame di dati (SVS, prod): ...Pandas "può solo Confronta i identicamente marcato oggetti dataframe" errore

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 

Per la terza stampa, viene visualizzato un messaggio di errore: È possibile confrontare solo oggetti DataFrame con etichetta identica. Se i primi due paragonati, cosa c'è di sbagliato con il 3 °?

Grazie

risposta

20

Ecco un piccolo esempio per dimostrare questo (che si applicava solo alle DataFrames, non serie, fino a quando Panda 0,19 quando si applica a entrambi):

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 

Una soluzione è quella sort the index prima (Nota: 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 

Nota: == è anche sensitive to the order of columns, quindi potrebbe essere necessario utilizzare 012.:

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 

Nota: Questo può ancora aumentare (se l'indice/colonne non sono identicamente etichettati dopo l'ordinamento).

+0

Il collegamento ordinamento è rotto. Si prega di correggerlo. –

+0

@ShreyashSSarnayak grazie, rimosso il riferimento a 'sort' è rimosso da pandas ora (sostituito con solo' sort_index')! –

10

Potete anche provare a far cadere la colonna di indice, se non è necessario per confrontare:

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

Ho usato la stessa tecnica in una prova di unità in questo modo:

from pandas.util.testing import assert_frame_equal 

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