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_1
と df_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_1
と df_2
の対応する要素を比較し、その位置の対応する要素が同じであれば True
を返し、そうでなければ False
を返します。
pandas.DataFrame.all()
メソッドを使えば、df_1
と 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))
出力:
0 False
1 True
2 True
3 False
4 True
dtype: bool
出力された True
の値を持つ行は対応する要素と同じ値を持つ。したがって、False
の値を持つ行は対応する要素の値が異なります。
インデックスを用いて、df_1
と 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])
出力:
Player Goals
0 Lewandowski 10
3 Messi 5
df_1
のすべての行のうち、df_2
の対応する行とは異なる値を持つ行をリストアップします。
もし df_1
と df_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_1
と df_2
を比較する前に df_2
のインデックスをリセットします。
また、比較する前に DataFrame の行数が同じであることを確認しなければなりません。
Suraj Joshi is a backend software engineer at Matrice.ai.
LinkedIn