Panda’s “Kan alleen identiek gelabelde DataFrame-objecten vergelijken” fout

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/

LEAVE A REPLY

Please enter your comment!
Please enter your name here

19 − 13 =

Other episodes