Pandas Fehler "Kann nur identisch beschriftete DataFrame-Objekte vergleichen" -Fehler

72

Ich verwende Pandas, um die Ausgaben von zwei Dateien zu vergleichen, die in zwei Datenrahmen (uat, prod) geladen wurden: ...

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

Beim dritten Druck wird eine Fehlermeldung angezeigt: Es können nur identisch beschriftete DataFrame-Objekte verglichen werden. Wenn die ersten beiden gut verglichen werden, was ist dann mit der dritten falsch?

Vielen Dank

user1804633
quelle
1
Hatte dieses Problem nach der Verwendung pd.concat, Antworten auf diese Frage geholfen
Azat Ibrakov

Antworten:

67

Hier ist ein kleines Beispiel, um dies zu demonstrieren (das nur für DataFrames und nicht für Series galt, bis Pandas 0.19, wo es für beide gilt):

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 besteht darin, den Index zuerst zu sortieren (Hinweis: Für einige Funktionen sind sortierte Indizes erforderlich ):

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

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

Hinweis: ==hängt auch von der Reihenfolge der Spalten ab , sodass Sie möglicherweise Folgendes verwenden müssen 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

Hinweis: Dies kann immer noch ausgelöst werden (wenn der Index / die Spalten nach dem Sortieren nicht identisch beschriftet sind).

Andy Hayden
quelle
sort_index hat meinen Datenrahmen in einen Nichttyp geändert. Dies änderte den Fehler, den ich von "ValueError: Kann nur identisch beschriftete Serienobjekte vergleichen" zu "AttributeError: 'NoneType'-Objekt hat kein Attribut' join '".
R. Cox
2
@ R.Cox Ich vermute, Sie machen so etwas wie df = df.sort_index(inplace=True), wenn Sie inplace verwenden, brauchen Sie das nicht df = , es ändert / aktualisiert den df DataFrame / die Variable und der Ausdruck gibt None zurück.
Andy Hayden
35

Sie können auch versuchen, die Indexspalte zu löschen, wenn sie nicht zum Vergleichen benötigt wird:

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

Ich habe dieselbe Technik in einem Unit-Test wie folgt verwendet:

from pandas.util.testing import assert_frame_equal

assert_frame_equal(actual.reset_index(drop=True), expected.reset_index(drop=True))
Core-Dump
quelle
3
Gott schütze dich. Ich hatte Probleme mit dem Problem, dass ähnliche Zeilen nicht zwischen verschiedenen DataFrames vergleichen können, und durch Entfernen des Index konnte der Vergleich durchgeführt werden.
Btc Sources
Sie können das Hinzufügen inplace=Truein Betracht ziehen, um sicherzustellen, dass der Index für nachgelagerte Vergleiche ruht.
Amc
Dies half, wenn die obige Antwort dies nicht tat. Vielen Dank! :)
Joe Rivera
3

Zu der Zeit, als diese Frage gestellt wurde, gab es in Pandas keine andere Funktion zum Testen der Gleichheit, aber sie wurde vor einiger Zeit hinzugefügt: pandas.equals

Sie verwenden es so:

df1.equals(df2)

Einige Unterschiede ==sind:

  • Sie erhalten den in der Frage beschriebenen Fehler nicht
  • Es wird ein einfacher Boolescher Wert zurückgegeben.
  • NaN-Werte an derselben Stelle werden als gleich angesehen
  • 2 DataFrames müssen dasselbe haben dtype, um als gleich zu gelten. Siehe diese Frage zum Stapelüberlauf
fliegender Holländer
quelle
0

Wenn Sie zwei DataFrames vergleichen, müssen Sie sicherstellen, dass die Anzahl der Datensätze im ersten DataFrame mit der Anzahl der Datensätze im zweiten DataFrame übereinstimmt. In unserem Beispiel hatte jeder der beiden DataFrames 4 Datensätze mit 4 Produkten und 4 Preisen.

Wenn beispielsweise einer der DataFrames 5 Produkte und der andere DataFrame 4 Produkte enthält und Sie versuchen, den Vergleich auszuführen, wird der folgende Fehler angezeigt:

ValueError: Kann nur identisch beschriftete Serienobjekte vergleichen

das sollte funktionieren

import pandas as pd
import numpy as np

firstProductSet = {'Product1': ['Computer','Phone','Printer','Desk'],
                   'Price1': [1200,800,200,350]
                   }
df1 = pd.DataFrame(firstProductSet,columns= ['Product1', 'Price1'])


secondProductSet = {'Product2': ['Computer','Phone','Printer','Desk'],
                    'Price2': [900,800,300,350]
                    }
df2 = pd.DataFrame(secondProductSet,columns= ['Product2', 'Price2'])


df1['Price2'] = df2['Price2'] #add the Price2 column from df2 to df1

df1['pricesMatch?'] = np.where(df1['Price1'] == df2['Price2'], 'True', 'False')  #create new column in df1 to check if prices match
df1['priceDiff?'] = np.where(df1['Price1'] == df2['Price2'], 0, df1['Price1'] - df2['Price2']) #create new column in df1 for price diff 
print (df1)

Beispiel von https://datatofish.com/compare-values-dataframes/

Shaina Raza
quelle