Comparer l'objet Pandas DataFrame

Suraj Joshi 12 avril 2022
Comparer l'objet Pandas DataFrame

Ce tutoriel explique comment comparer des objets Pandas DataFrame en Python. Nous pouvons comparer des DataFrames en utilisant l’opérateur ==.

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)

Production :

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

Nous utiliserons les DataFrames df_1 et df_2 pour démontrer la comparaison des DataFrames dans cet article.

Comparer l’objet Pandas DataFrame en utilisant l’opérateur ==

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)

Production :

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

Il compare les éléments correspondants de df_1 et df_2 et retourne True si les éléments correspondants de cette position sont les mêmes, sinon il retourne False.

Nous pouvons utiliser la méthode pandas.DataFrame.all() pour savoir quelles lignes sont identiques dans df_1 et 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))

Production :

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

Les lignes avec la valeur True dans la sortie ont la même valeur que les éléments correspondants. Par conséquent, les lignes avec une valeur False dans la sortie ont des valeurs différentes des éléments correspondants.

Nous pouvons utiliser l’indexation pour lister toutes les lignes dont les valeurs diffèrent dans df_1 et 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])

Production :

        Player  Goals
0  Lewandowski     10
3        Messi      5

Il liste toutes les lignes de df_1, qui ont des valeurs différentes des lignes correspondantes dans df_2.

Si nous avons des index différents pour df_1 et df_2, nous obtenons une erreur disant 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)

Production :

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

Nous pouvons utiliser la méthode pandas.DataFrame.reset_index() pour réinitialiser les index afin de résoudre le problème ci-dessus.

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)

Production :

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

Elle réinitialise l’index de df_2 avant de comparer df_1 et df_2 afin que deux dataframes aient les mêmes index pour rendre la comparaison possible.

Nous devons également nous assurer que nous avons le même nombre de lignes dans DataFrames avant de les comparer.

Auteur: Suraj Joshi
Suraj Joshi avatar Suraj Joshi avatar

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

LinkedIn

Article connexe - Pandas DataFrame