Comparar Pandas DataFrame Objectos

Este tutorial explica como podemos comparar objectos Pandas DataFrame em Python. Podemos comparar DataFrames utilizando o 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)

Resultado:

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

Vamos utilizar os campos DataFrames df_1 e df_2 para demonstrar a comparação de DataFrames neste artigo.

Comparar Pandas DataFrame Object utilizando o 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 os elementos correspondentes de df_1 ad df_2 e retorna True se os elementos correspondentes dessa posição forem os mesmos, caso contrário retorna False.

Podemos utilizar pandas.DataFrame.all() método para saber que linhas são as mesmas tanto no df_1 como no 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))

Resultado:

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

As linhas com valor True na saída têm o mesmo valor que os elementos correspondentes. Assim, as linhas com valor Falso na saída têm valores diferentes dos elementos correspondentes.

Podemos utilizar a indexação para listar todas as linhas cujos valores diferem em 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])

Resultado:

        Player  Goals
0  Lewandowski     10
3        Messi      5

Lista todas as linhas de df_1, que têm valores diferentes dos valores das linhas correspondentes em df_2.

Se tivermos índices diferentes para df_1 e df_2, obtemos um erro dizendo 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)

Resultado:

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

Podemos utilizar o método pandas.DataFrame.reset_index() para repor os índices de forma a ultrapassar o problema acima referido.

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)

Resultado:

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

Reinicia o índice de df_2 antes de comparar df_1 e df_2, para que dois dataframes tenham os mesmos índices para tornar a comparação possível.

Também devemos certificar-nos de que temos os mesmos números de linhas em DataFrames antes de os compararmos.

Artigo relacionado - Pandas DataFrame

  • Pegue fatias de coluna do DataFrame em Pandas
  • Pandas Copiar DataFrame