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
pd.concat
, Antworten auf diese Frage geholfenAntworten:
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üssensort_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).
quelle
df = df.sort_index(inplace=True)
, wenn Sie inplace verwenden, brauchen Sie das nichtdf =
, es ändert / aktualisiert den df DataFrame / die Variable und der Ausdruck gibt None zurück.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))
quelle
inplace=True
in Betracht ziehen, um sicherzustellen, dass der Index für nachgelagerte Vergleiche ruht.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:
Einige Unterschiede
==
sind:dtype
, um als gleich zu gelten. Siehe diese Frage zum Stapelüberlaufquelle
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/
quelle