1. 2つのデータフレームの比較

2つのデータフレームの値を比較したいことがあります。

比較するだけでなく、 異なる場所がどこなのかを確認したい こともあります。

このような処理について考えた記事を一度書いています。

Example 1. @ryamashina.com

2つのデータフレームを比較して違う箇所を把握したい場合には pandas.DataFrame.compare を使用します。

このcompareのResultが扱いが難しいので結果を加工する方法を 過去の記事 で触れました。

過去の記事では差分がある列を特定しその後で行を特定する段階的な方法を紹介しました。

ただ、この方法だと手間がかかっていしまうので 差分の行と列を一挙に特定する方法 を整理しました。

この記事ではこの整理した方法をご紹介します。

2. 公式のドキュメント

公式のドキュメントはこちらです。

Example 2. @pandas.pydata.org

今回使用するデータはこちらのページのデータを流用させていただきます。

3. データの準備

creaet_data.py
import pandas as pd
import numpy as np

df = pd.DataFrame(
    {
        "col1": ["a", "a", "b", "b", "a"],
        "col2": [1.0, 2.0, 3.0, np.nan, 5.0],
        "col3": [1.0, 2.0, 3.0, 4.0, 5.0]
    },
    columns=["col1", "col2", "col3"],
)

df2 = df.copy()
df2.loc[0, 'col1'] = 'c'
df2.loc[2, 'col3'] = 4.0
df2.loc[4, 'col2'] = np.nan
  1. dfを作成

  2. コピーしてdf2を作成

  3. 幾つかの値を変更

    1. 0:col1 を’c'

    2. 2:col3 を4

    3. 4:col2 をnp.nan

上記のa. b. c.を特定すること が今回の目的です。

4. 関数を作成

差分を特定する関数を作成します。

pandas.DataFrame.compareの結果を加工して差分のデータフレームを作成します。

4.1. 作成した関数:compare

compare.py
def compare(df1, df2):
    comp = (
        df1.compare(
            df2
        )
        .unstack()
        .dropna()
        .unstack(1)
        .reset_index()
        .set_axis(
            [
                'COLUMN',
                'INDEX',
                'self',
                'other',
            ],
            axis=1,
        )
    )
    return comp

4.2. 結果の確認

run.py
comp = compare(df, df2)
comp
result
  COLUMN  INDEX self other
0   col1      0    a     c
1   col2      4  5.0   NaN
2   col3      2  3.0   4.0

差分のCOLUMN, INDEX, 前後の値の違いを確認できています。

5. まとめ

compareの結果を加工して差分を一覧できる関数を作成しました。

今回は以上です。