PythonのPandasのデータフレームの比較について

Python,イメージ

AI実装検定のご案内

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のデータフレームの比較についてでした。

最後までお読みいただき、ありがとうございました。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次