Pandas DataFrame オブジェクトを比較

Suraj Joshi 2022年1月22日
Pandas DataFrame オブジェクトを比較

ここでは Python での Pandas DataFrame オブジェクトの比較方法を説明します。演算子 == を使って比較することができます。

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)

出力:

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

この記事では、DataFrame df_1df_2 を使って、DataFrame の比較を実演します。

演算子 == を使った Pandas DataFrame オブジェクトの比較

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)

出力:

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

これは df_1df_2 の対応する要素を比較し、その位置の対応する要素が同じであれば True を返し、そうでなければ False を返します。

pandas.DataFrame.all() メソッドを使えば、df_1df_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))

出力:

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

出力された True の値を持つ行は対応する要素と同じ値を持つ。したがって、False の値を持つ行は対応する要素の値が異なります。

インデックスを用いて、df_1df_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])

出力:

        Player  Goals
0  Lewandowski     10
3        Messi      5

df_1 のすべての行のうち、df_2 の対応する行とは異なる値を持つ行をリストアップします。

もし df_1df_2 のインデックスが異なる場合、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)

出力:

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

pandas.DataFrame.reset_index() メソッドを使ってインデックスをリセットすることで、上記の問題を解決することができます。

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)

出力:

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

これは、df_1df_2 を比較する前に df_2 のインデックスをリセットします。

また、比較する前に DataFrame の行数が同じであることを確認しなければなりません。

著者: Suraj Joshi
Suraj Joshi avatar Suraj Joshi avatar

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

LinkedIn

関連記事 - Pandas DataFrame