Python の pandas
ライブラリでは、2つのデータフレーム(DataFrame)を比較する機能が充実しています。
データ分析や検証・テストなどで非常に有用です。
ここでは以下の流れで詳しく解説します。
目次
基本的な比較方法
通常の ==
や !=
を使うと、要素単位での比較になります。
import pandas as pd
df1 = pd.DataFrame({
'A': [1, 2, 3],
'B': [4, 5, 6]
})
df2 = pd.DataFrame({
'A': [1, 2, 999],
'B': [4, 0, 6]
})
# 要素ごとに比較
print(df1 == df2)
出力
A B
0 True True
1 True False
2 False True
compare()
関数による比較
Pandas 1.1.0 以降では、差分のみを抽出する .compare()
関数が便利です。
diff = df1.compare(df2)
print(diff)
出力
A B
self other self other
1 NaN NaN 5.0 0.0
2 3.0 999.0 NaN NaN
- self:
df1
- other:
df2
- 異なる箇所だけ表示される
keep_shape=True
を使うと元と同じ形でNaN
埋めできる
diff_keep_shape = df1.compare(df2, keep_shape=True)
print("\n.compare() + keep_shape=True:")
print(diff_keep_shape)
要素単位の比較と抽出
違う値の位置を使ってデータを抽出することも可能です。
import numpy as np
# 要素単位で異なる場所をマスクとして取得
mask = df1 != df2
print("\n異なる要素だけ抽出:")
print(df1[mask])
出力
異なる要素だけ抽出:
A B
0 NaN NaN
1 NaN 5.0
2 3.0 NaN
あるいは np.where()
を使って、新しいフラグやマージ結果を作るのも有効です。
# 'DIFF' or 'SAME' の判定結果を DataFrame 化
df_diff_flag = pd.DataFrame(np.where(df1 != df2, 'DIFF', 'SAME'), columns=df1.columns)
print("\nDIFF or SAME フラグ表示:")
print(df_diff_flag)
出力
DIFF or SAME フラグ表示:
A B
0 SAME SAME
1 SAME DIFF
2 DIFF SAME
equals()
による完全一致の比較
全体が完全一致しているかどうかをチェックしたい場合は equals()
を使います。
# 完全一致チェック
is_equal = df1.equals(df2)
print("\nDataFrame全体が一致しているか?:", is_equal)
- 行順・列順・インデックス・データ型まで比較します
- 本番環境での「差があるかないか」の一括確認に便利です
ユースケース別サンプル
差分のみの抽出
diff = df1.compare(df2)
print("\n差分のみを抽出:")
print(diff)
差がある行だけ抽出
diff_only_rows = df1[df1 != df2].dropna(how='all')
print("\n差がある行だけを抽出:")
print(diff_only_rows)
異なる行番号だけリストアップ
diff_rows_mask = (df1 != df2).any(axis=1)
diff_rows = df1[diff_rows_mask]
print("\n異なる行の抽出:")
print(diff_rows)
行や列単位の比較テクニック
特定列のみ比較
print("\n列 'A' だけ比較:", df1['A'].equals(df2['A']))
行単位でループして比較
print("\n行単位で比較:")
for i, (row1, row2) in enumerate(zip(df1.iterrows(), df2.iterrows())):
if not row1[1].equals(row2[1]):
print(f"Row {i} differs:")
print("df1:", row1[1].to_dict())
print("df2:", row2[1].to_dict())
まとめ
目的 | 方法 |
---|---|
要素単位の比較 | df1 == df2 |
差分だけ表示 | df1.compare(df2) |
全体一致チェック | df1.equals(df2) |
差分の視覚化 | .compare().style |
差分の行番号だけ知りたい | (df1 != df2).any(axis=1) |
以上、PythonのPandasのデータフレームの比較についてでした。
最後までお読みいただき、ありがとうございました。