Confronta Pandas DataFrame Object

Suraj Joshi 25 aprile 2021
Confronta Pandas DataFrame Object

Questo tutorial spiega come possiamo confrontare gli oggetti DataFrame di Pandas in Python. Possiamo confrontare i DataFrame usando l’operatore ==.

import pandas as pd

data_season1 = {
    "Player": ["Lewandowski", "Haland", "Ronaldo", "Messi", "Mbappe"],
    "Goals": [10, 8, 6, 5, 4],
}

data_season2 = {
    "Player": ["Lewandowski", "Haland", "Ronaldo", "Messi", "Mbappe"],
    "Goals": [7, 8, 6, 7, 4],
}

df_1 = pd.DataFrame(data_season1)
df_2 = pd.DataFrame(data_season2)

print("df_1:")
print(df_1)

print("")

print("df_2:")
print(df_2)

Produzione:

df_1:
        Player  Goals
0  Lewandowski     10
1       Haland      8
2      Ronaldo      6
3        Messi      5
4       Mbappe      4

df_2:
        Player  Goals
0  Lewandowski      7
1       Haland      8
2      Ronaldo      6
3        Messi      7
4       Mbappe      4

Useremo i DataFrame df_1 e df_2 per dimostrare il confronto di DataFrame in questo articolo.

Confronta l’oggetto DataFrame di Pandas usando l’operatore ==

import pandas as pd

data_season1 = {
    "Player": ["Lewandowski", "Haland", "Ronaldo", "Messi", "Mbappe"],
    "Goals": [10, 8, 6, 5, 4],
}

data_season2 = {
    "Player": ["Lewandowski", "Haland", "Ronaldo", "Messi", "Mbappe"],
    "Goals": [7, 8, 6, 7, 4],
}

df_1 = pd.DataFrame(data_season1)
df_2 = pd.DataFrame(data_season2)

print(df_1 == df_2)

Produzione:

   Player  Goals
0    True  False
1    True   True
2    True   True
3    True  False
4    True   True

Confronta gli elementi corrispondenti di df_1 ad df_2 e restituisce True se gli elementi corrispondenti di quella posizione sono gli stessi, altrimenti restituisce False.

Possiamo usare il metodo pandas.DataFrame.all() per sapere quali righe sono uguali sia in df_1 che in df_2.

import pandas as pd

data_season1 = {
    "Player": ["Lewandowski", "Haland", "Ronaldo", "Messi", "Mbappe"],
    "Goals": [10, 8, 6, 5, 4],
}

data_season2 = {
    "Player": ["Lewandowski", "Haland", "Ronaldo", "Messi", "Mbappe"],
    "Goals": [7, 8, 6, 7, 4],
}

df_1 = pd.DataFrame(data_season1)
df_2 = pd.DataFrame(data_season2)

print((df_1 == df_2).all(axis=1))

Produzione:

0    False
1     True
2     True
3    False
4     True
dtype: bool

Le righe con il valore True nell’output hanno lo stesso valore degli elementi corrispondenti. Quindi, le righe con il valore False nell’output hanno valori diversi degli elementi corrispondenti.

Possiamo usare l’indicizzazione per elencare tutte le righe i cui valori differiscono in df_1 e df_2.

import pandas as pd

data_season1 = {
    "Player": ["Lewandowski", "Haland", "Ronaldo", "Messi", "Mbappe"],
    "Goals": [10, 8, 6, 5, 4],
}

data_season2 = {
    "Player": ["Lewandowski", "Haland", "Ronaldo", "Messi", "Mbappe"],
    "Goals": [7, 8, 6, 7, 4],
}

df_1 = pd.DataFrame(data_season1)
df_2 = pd.DataFrame(data_season2)

print(df_1[(df_1 == df_2).all(axis=1) == False])

Produzione:

        Player  Goals
0  Lewandowski     10
3        Messi      5

Elenca tutte le righe di df_1, che hanno valori diversi dalle righe corrispondenti in df_2.

Se abbiamo indici diversi per df_1 e df_2, otteniamo un errore che dice ValueError: Can only compare identically-labeled DataFrame objects.

import pandas as pd

data_season1 = {
    "Player": ["Lewandowski", "Haland", "Ronaldo", "Messi", "Mbappe"],
    "Goals": [10, 8, 6, 5, 4],
}

data_season2 = {
    "Player": ["Lewandowski", "Haland", "Ronaldo", "Messi", "Mbappe"],
    "Goals": [7, 8, 6, 7, 4],
}

df_1 = pd.DataFrame(data_season1)
df_2 = pd.DataFrame(data_season2, index=["a", "b", "c", "d", "e"])

print(df_1 == df_2)

Produzione:

Traceback (most recent call last):
...
ValueError: Can only compare identically-labeled DataFrame objects

Possiamo usare il metodo pandas.DataFrame.reset_index() per reimpostare gli indici e superare il problema di cui sopra.

import pandas as pd

data_season1 = {
    "Player": ["Lewandowski", "Haland", "Ronaldo", "Messi", "Mbappe"],
    "Goals": [10, 8, 6, 5, 4],
}

data_season2 = {
    "Player": ["Lewandowski", "Haland", "Ronaldo", "Messi", "Mbappe"],
    "Goals": [7, 8, 6, 7, 4],
}

df_1 = pd.DataFrame(data_season1)
df_2 = pd.DataFrame(data_season2, index=["a", "b", "c", "d", "e"])
df_2.reset_index(drop=True, inplace=True)

print(df_1 == df_2)

Produzione:

   Player  Goals
0    True  False
1    True   True
2    True   True
3    True  False
4    True   True

Reimposta l’indice di df_2 prima di confrontare df_1 e df_2 in modo che due DataFrame abbiano gli stessi indici per rendere possibile il confronto.

Dobbiamo anche assicurarci di avere lo stesso numero di righe in DataFrames prima di confrontarli.

Autore: Suraj Joshi
Suraj Joshi avatar Suraj Joshi avatar

Suraj Joshi is a backend software engineer at Matrice.ai.

LinkedIn

Articolo correlato - Pandas DataFrame