Comparar el objeto DataFrame de Pandas

Suraj Joshi 25 febrero 2021
Comparar el objeto DataFrame de Pandas

Este tutorial explica cómo podemos comparar objetos Pandas DataFrame en Python. Podemos comparar DataFrames usando el operador ==.

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)

Producción :

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

Utilizaremos los DataFrames df_1 y df_2 para demostrar la comparación de DataFrames en este artículo.

Comparar el objeto DataFrame de Pandas usando el operador ==

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)

Resultado:

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

Compara los elementos correspondientes de df_1 ad df_2 y devuelve True si los elementos correspondientes de esa posición son iguales, en caso contrario devuelve False.

Podemos utilizar el método pandas.DataFrame.all() para saber qué filas son iguales en df_1 y 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))

Producción :

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

Las filas con valor True en la salida tienen el mismo valor que los elementos correspondientes. Por lo tanto, las filas con valor False en la salida tienen valores diferentes de los elementos correspondientes.

Podemos utilizar la indexación para listar todas las filas cuyos valores difieren en df_1 y 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])

Producción :

        Player  Goals
0  Lewandowski     10
3        Messi      5

Enumera todas las filas de df_1, que tienen valores diferentes a las filas correspondientes en df_2.

Si tenemos índices diferentes para df_1 y df_2, obtenemos un error que dice ValueError: Sólo se pueden comparar objetos DataFrame con etiquetas idénticas.

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)

Resultado:

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

Podemos utilizar el método pandas.DataFrame.reset_index() para restablecer los índices y superar el problema anterior.

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)

Producción :

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

Restablece el índice de df_2 antes de comparar df_1 y df_2 para que dos dataframes tengan los mismos índices y sea posible la comparación.

También debemos asegurarnos de que tenemos el mismo número de filas en los DataFrames antes de compararlos.

Suraj Joshi avatar Suraj Joshi avatar

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

LinkedIn

Artículo relacionado - Pandas DataFrame