Ik gebruik Panda’s om de uitvoer van twee bestanden te vergelijken die in twee dataframes zijn geladen (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
Voor de derde afdruk krijg ik een foutmelding:
Kan alleen identiek gelabelde DataFrame-objecten vergelijken. Als de eerste twee goed vergeleken zijn, wat is er dan mis met de derde?
Bedankt
Antwoord 1, autoriteit 100%
Hier is een klein voorbeeld om dit aan te tonen (dat alleen van toepassing was op DataFrames, niet op Series, tot Pandas 0.19 waar het op beide van toepassing is):
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
Een oplossing is om de index te sorteren eerst (Opmerking: voor sommige functies zijn gesorteerde indexen vereist):
In [4]: df2.sort_index(inplace=True)
In [5]: df1 == df2
Out[5]:
0 1
0 True True
1 True True
Opmerking: ==
is ook gevoelig voor de volgorde van kolommen, dus u moet mogelijk sort_index(axis=1)
gebruiken:
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
Opmerking: dit kan nog steeds omhoog gaan (als de index/kolommen niet identiek zijn gelabeld na het sorteren).
Antwoord 2, autoriteit 49%
Je kunt ook proberen de indexkolom weg te laten als het niet nodig is om te vergelijken:
print(df1.reset_index(drop=True) == df2.reset_index(drop=True))
Ik heb dezelfde techniek gebruikt in een eenheidstest, zoals:
from pandas.util.testing import assert_frame_equal
assert_frame_equal(actual.reset_index(drop=True), expected.reset_index(drop=True))
Antwoord 3, autoriteit 9%
Op het moment dat deze vraag werd gesteld, was er geen andere functie in Pandas om gelijkheid te testen, maar deze is een tijdje geleden toegevoegd: pandas.equals
Je gebruikt het als volgt:
df1.equals(df2)
Enkele verschillen met ==
zijn:
- U krijgt niet de fout die wordt beschreven in de vraag
- Het geeft een eenvoudige boolean terug.
- NaN-waarden op dezelfde locatie worden als gelijk beschouwd
- 2 DataFrames moeten hetzelfde
dtype
hebben om als gelijk te worden beschouwd, zie deze stackoverflow-vraag
Antwoord 4
Als u twee DataFrames vergelijkt, moet u ervoor zorgen dat het aantal records in het eerste DataFrame overeenkomt met het aantal records in het tweede DataFrame. In ons voorbeeld had elk van de twee DataFrames 4 records, met 4 producten en 4 prijzen.
Als bijvoorbeeld een van de DataFrames 5 producten had, terwijl de andere DataFrame 4 producten had, en u probeert de vergelijking uit te voeren, krijgt u de volgende foutmelding:
ValueError: kan alleen identiek gelabelde serie-objecten vergelijken
dit zou moeten werken
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)
voorbeeld van https://datatofish.com/compare-values-dataframes/