CSVの新旧ファイルを比較して変更・追加・削除を判定する方法|Google Colab+Pythonで自動化

Python・データ処理

毎月届く価格表や在庫一覧、商品マスターなどを、前回のファイルと見比べながら変更点を探していませんか?

データが10件程度なら目視でも確認できますが、100件、1,000件と増えてくると、価格が変わった商品や在庫数が変わった商品、新しく追加された商品、削除された商品、何も変わっていない商品を一つずつ確認するのはかなり大変です。

しかも、新しいデータで行順が変わっていると、単純に上から見比べるだけでは確認しづらくなります。

そこで今回は、Google ColabとPythonを使って、2つのCSVファイルを自動比較する方法を紹介します。

Google Colabを使うので、PythonをPCへインストールする必要はなく、ブラウザ上で実行することができます!

今回、実際に次の内容まで確認しました。

  • 価格変更を検出できる
  • 在庫変更を検出できる
  • 新しく追加されたデータを判定できる
  • 削除されたデータを判定できる
  • 変更のないデータも「変更なし」として残せる
  • CSVの行順を変えても正しく比較できる
  • 比較結果をCSVとして保存できる

Pythonをほとんど使ったことがない人でも試せるように、コードの意味や、自分のCSVに合わせて変更する場所も説明します。

✅ この記事は実際に動作検証しています

新旧2つのCSVをGoogle Colabで比較し、追加・変更・削除されたデータを判定しました。データの並び順を変更した場合でも、比較結果が変わらないことを確認しています。

検証結果: 新旧CSV比較:成功 / 追加・変更・削除を判定 / 並び順変更後も比較結果を確認 / comparison_result.csvを出力

今回作る仕組み

今回作る仕組みは次のようなものです。

旧CSV + 新CSV
↓
Google Colabへアップロード
↓
商品コードをキーにして比較
↓
変更・追加・削除・変更なしを判定
↓
全データを比較結果としてまとめる
↓
comparison_result.csvとして保存

今回のポイントは、変更されたデータだけを抜き出すのではなく、変更のなかったデータも残しておくことです。

例えば比較結果をExcelで開いたあと、

  • 「変更」だけ表示
  • 「追加」だけ表示
  • 「削除」だけ表示
  • 「変更なし」を非表示

といった使い方ができます。

元データ全体を残したまま確認できるので、実務ではこちらの方が扱いやすいケースが多いです。

なぜ今回はExcelではなくCSVを使うのか

普段の業務では、CSVよりExcelファイル(.xlsx)を使う機会の方が多い人もいると思います。

それでも今回は、まずCSVを使って比較します。

理由は、データそのものの比較に集中しやすいからです。

CSVは基本的に、行と列からなる表データだけを保存するシンプルなファイルです。

一方、Excelにはデータ以外にも、

  • 複数シート
  • セルの色
  • 罫線
  • 数式
  • 結合セル
  • 書式
  • 非表示の行・列

などがあります。

最初からExcelを対象にすると、値の違いを調べたいだけなのに、Excel特有の要素まで考える必要が出てきます。

今回はまず、旧データと新データの中身を比較するという処理そのものを分かりやすく確認するため、CSVを使います。

なお、Excelファイルにも同じ考え方を応用できます。記事の後半で触れます。

比較するCSVを準備する

今回はテスト用に、次の2ファイルを使いました。

旧データ:old_products.csv

商品コード商品名価格在庫
A001商品A100010
A002商品B150020
A003商品C200015
A005商品E250030

新データ:new_products.csv

商品コード商品名価格在庫
A001商品A120010
A002商品B150018
A004商品D18008
A005商品E250030

2つを比較すると、次の違いがあります。

  • A001:価格が1000円 → 1200円
  • A002:在庫が20 → 18
  • A003:新データから削除
  • A004:新データで追加
  • A005:変更なし

この5パターンが正しく判定できるか確認します。

今回の記事で使用したテスト用CSVを用意しています。まず同じデータで動作を確認したい場合は、以下の2ファイルをダウンロードして使ってください。

Google Colabを使う

今回はPCにPythonをインストールせず、Google Colabを使います。

Google Colabは、ブラウザ上でPythonコードを実行できるサービスです。

今回のような簡単なCSV比較であれば、

  • Pythonのインストール
  • PATH設定
  • pandasのインストール
  • VS Codeなどの準備

をしなくても始められます。

Google Colabを開いたら、新しいノートブックを作成します。

今回は、

TaskLess Lab_CSV差分比較テスト

という名前で作成しました。

2つのCSVをアップロードする

Google Colabの左側にあるフォルダアイコンをクリックします。

ファイル一覧を表示したら、

old_products.csv
new_products.csv

の2ファイルをアップロードします。

sample_data というフォルダが表示されていても、その中に入れる必要はありません。

次のように同じ階層に置けばOKです。

content
├─ sample_data
├─ old_products.csv
└─ new_products.csv

まずCSVを読み込む

最初のコードセルに、次のコードを貼り付けます。

import pandas as pd

old_df = pd.read_csv("old_products.csv")
new_df = pd.read_csv("new_products.csv")

print("旧データ")
display(old_df)

print("新データ")
display(new_df)

コードを実行すると、旧データと新データが表として表示されます。

ここではまだ比較はしていません。

まず、

  • 商品コード
  • 商品名
  • 価格
  • 在庫

が正しく読み込まれているか確認します。

日本語も正常に表示されていればOKです。

新しいコードセルを追加する

次に比較用のコードを入れるため、新しいコードセルを追加します。

Google Colabでは、

  • 「+コード」をクリックする
  • セルの下に表示される「+コード」をクリックする

などの方法で追加できます。

また、キーボードではShift+Enterを使うと、現在のセルを実行して次のセルへ進めます。

慣れてくると、

コードを書く
↓
Shift + Enter
↓
結果を見る
↓
次のコードを書く

と進められるので便利です。

新旧CSVを比較する

新しく作ったコードセルに、次のコードを貼り付けます。

# 商品コードをキーにして新旧データを結合
merged = old_df.merge(
    new_df,
    on="商品コード",
    how="outer",
    suffixes=("_旧", "_新"),
    indicator=True
)

# 追加・削除・変更・変更なしを判定
def judge(row):
    if row["_merge"] == "left_only":
        return "削除"

    elif row["_merge"] == "right_only":
        return "追加"

    else:
        changed = (
            row["商品名_旧"] != row["商品名_新"]
            or row["価格_旧"] != row["価格_新"]
            or row["在庫_旧"] != row["在庫_新"]
        )

        return "変更" if changed else "変更なし"


merged["判定"] = merged.apply(judge, axis=1)

# 比較結果として全データを残す
comparison_df = merged[
    [
        "商品コード",
        "判定",
        "商品名_旧",
        "商品名_新",
        "価格_旧",
        "価格_新",
        "在庫_旧",
        "在庫_新"
    ]
]

display(comparison_df)

少し長く見えますが、やっていることはそれほど複雑ではありません。

ここからブロックごとに見ていきます。

比較コードは何をしているのか

1.商品コードを基準に新旧データを対応させる

最初がこの部分です。

merged = old_df.merge(
    new_df,
    on="商品コード",
    how="outer",
    suffixes=("_旧", "_新"),
    indicator=True
)

特に重要なのが、

on="商品コード"

です。

これは、どの列を使って「同じデータ」と判断するかを指定しています。

今回は商品コードを使っています。

つまり、

旧:A001
新:A001

があれば、同じ商品として比較します。

なぜ行番号で比較しないのか

例えば旧ファイルが、

A001
A002
A003

だったとして、新ファイルに商品が追加され、

A001
A004
A002
A003

になったとします。

単純に「2行目と2行目」を比較すると、

A002 と A004

を比較してしまいます。

そこで、行番号ではなく商品コードを使って対応させています。

自分のCSVでは「商品コード」を変更する

自分のCSVで比較キーが商品コードではない場合は、

on="商品コード"

を変更します。

例えばSKUなら、

on="SKU"

JANコードなら、

on="JANコード"

顧客データなら、

on="顧客ID"

といった形です。

ポイントは、1件を一意に識別できる列を選ぶことです。

2.削除されたデータを判定する

次がこの部分です。

if row["_merge"] == "left_only":
    return "削除"

left_only は、旧データにはあるが、新データにはないという状態です。

今回ならA003が該当します。

3.追加されたデータを判定する

次はこちらです。

elif row["_merge"] == "right_only":
    return "追加"

これは逆に、新データにはあるが、旧データにはないという意味です。

今回ならA004が該当します。

4.両方に存在するデータの中身を比較する

旧データと新データの両方に商品が存在する場合は、中身を比較します。

changed = (
    row["商品名_旧"] != row["商品名_新"]
    or row["価格_旧"] != row["価格_新"]
    or row["在庫_旧"] != row["在庫_新"]
)

今回は、

  • 商品名
  • 価格
  • 在庫

を比較しています。

この中のどれか1つでも違えば「変更」、全部同じなら「変更なし」と判定します。

自分のCSVでは「比較したい列」を変更する

例えば自分のCSVが、

商品コード商品名仕入価格販売価格在庫仕入先

となっている場合。

仕入価格・販売価格・仕入先を比較したければ、

changed = (
    row["商品名_旧"] != row["商品名_新"]
    or row["仕入価格_旧"] != row["仕入価格_新"]
    or row["販売価格_旧"] != row["販売価格_新"]
    or row["仕入先_旧"] != row["仕入先_新"]
)

のようにします。

逆に、「在庫の変化は気にしない」のであれば、在庫の比較条件を入れなければOKです。

「_旧」「_新」は何?

コードを見ると、

価格_旧
価格_新

のようになっています。

これは、次の部分で指定しています。

suffixes=("_旧", "_新")

旧ファイルと新ファイルの両方に「価格」という列があるため、そのままだと区別できません。

そこでPython側で、

価格_旧
価格_新

と名前を付けています。

5.比較結果に表示する列を指定する

最後に、この部分で結果として表示する列を決めています。

comparison_df = merged[
    [
        "商品コード",
        "判定",
        "商品名_旧",
        "商品名_新",
        "価格_旧",
        "価格_新",
        "在庫_旧",
        "在庫_新"
    ]
]

例えば仕入価格も表示したければ、

"仕入価格_旧",
"仕入価格_新",

を追加します。

自分用に変更する場所は主に3か所

変更箇所役割
on="商品コード"同じデータと判断する基準
changed = (...)変更を確認する項目
comparison_df = [...]結果に表示する項目

最初はコード全体を理解しなくても、この3か所を押さえておけばカスタマイズしやすくなります。

実際に比較した結果

今回のテストデータでは、次の結果になりました。

商品コード判定
A001変更
A002変更
A003削除
A004追加
A005変更なし

「変更なし」も残しておく理由

変更点だけを見るなら、A005は不要にも見えます。

ただし今回は、あえて変更なしのデータも残します。

理由は、この比較結果ファイルをそのままExcelなどで使いやすくするためです。

Excelで「判定」列にフィルターを付ければ、「変更」「追加」「削除」だけを表示できます。

逆にフィルターを解除すれば、元データ全体を確認できます。

また、「A005は比較されなかった」のではなく、比較した結果、変化がなかったことも分かります。

NaNはエラーではない

追加・削除されたデータを見ると、一部のセルに NaN と表示されます。

これはエラーではありません。

例えばA003は旧データにはありますが、新データにはありません。

そのため、新データ側の商品名・価格・在庫に値が存在せず、NaNと表示されます。

NaNは、その場所に値が存在しないという意味だと考えればOKです。

行順が変わっても比較できる?

ここも実際に確認しました。

新しいCSVを次の順番に変更します。

商品コード,商品名,価格,在庫
A005,商品E,2500,30
A004,商品D,1800,8
A002,商品B,1500,18
A001,商品A,1200,10

最初とはかなり並び順が変わっています。

それでも比較コードを実行すると、

  • A001 → 変更
  • A002 → 変更
  • A003 → 削除
  • A004 → 追加
  • A005 → 変更なし

と、同じ判定結果になりました。

これは、行番号ではなく商品コードをキーにして比較しているためです。

比較結果をCSVとして保存する

最後に、比較結果をファイルとして保存します。

新しいコードセルを追加して、次を実行します。

comparison_df.to_csv(
    "comparison_result.csv",
    index=False,
    encoding="utf-8-sig"
)

print("comparison_result.csv を作成しました")

実行すると、Google Colabの左側のファイル一覧に、

comparison_result.csv

が表示されます。

ファイル右側のメニューからダウンロードできます。

なぜutf-8-sigを指定しているのか

CSV保存コードには、

encoding="utf-8-sig"

を指定しています。

これは主に、日本語データをExcelで開いたときの文字化けを避けやすくするためです。

Excelで比較結果を使う

ダウンロードした comparison_result.csv はExcelで開けます。

判定列には、

  • 変更
  • 追加
  • 削除
  • 変更なし

が入っています。

Excelのフィルター機能を使えば、「変更だけ確認したい」場合は「変更」だけ表示できます。

Excelファイルそのものを比較したい場合

今回はCSVで実際に検証しました。

Excelファイルでも基本的な考え方は同じです。

CSVの場合は、

pd.read_csv("old_products.csv")

ですが、Excelなら、

pd.read_excel("old_products.xlsx")

のように読み込めます。

ただしExcelには、複数シート、数式、書式、結合セル、非表示セルなどCSVにはない要素があります。

そのため、Excelファイルの「値」だけを比較したい場合は比較的応用しやすいですが、セルの色や数式、書式まで比較したい場合は別の処理が必要になります。

今回はCSV版のみ実機検証しています。

商品コードが重複している場合は注意

今回のコードは、「商品コード」が一意であることを前提にしています。

同じ商品コードが複数行ある場合は、

商品コード+店舗

や、

商品コード+仕入先

のように複数の項目を組み合わせて比較する必要があります。

こんなCSVにも応用できる

仕入先価格表

旧価格表
+
新価格表
↓
値上げ・値下げを確認

在庫一覧

昨日の在庫
+
今日の在庫
↓
在庫数の変化を確認

商品マスター

前回の商品マスター
+
最新版の商品マスター
↓
商品の追加・削除・変更を確認

顧客マスター

旧顧客データ
+
新顧客データ
↓
住所や担当者などの変更を確認

特に、毎週・毎月、同じ形式のファイルを見比べているような業務とは相性がいいです。

この方法が向いていないケース

今回のコードですべての比較ができるわけではありません。

  • 比較キーになる列がない
  • キーが大量に重複している
  • CSVの列構成が毎回変わる
  • Excelのセル色を比較したい
  • 数式の違いを調べたい
  • 複数シートをまとめて比較したい

といった場合は、別の処理が必要になります。

新旧ファイルを比較する前に、商品コードなどの表記を揃えておくと差分を判定しやすくなります。

Excel・CSVの表記ゆれや余分な空白をまとめて整える方法|Google Colab+Python
Excel・CSVの表記ゆれや余分な空白をGoogle ColabとPythonでまとめて整える方法を解説。前後スペース、大文字小文字、全角半角の統一からCSV保存まで実際に検証しました。

新旧比較とは別に、同じ商品コードが複数入っていないか確認したい場合は重複チェックもできます。

CSVの重複データを抽出・削除する方法|Google Colab+Pythonで自動化
商品マスターや顧客名簿、注文一覧の重複データをGoogle ColabとPythonで抽出・削除する方法を解説。完全一致と特定列の重複判定、first・lastの違い、CSV保存まで実際に検証しました。

まとめ

今回はGoogle ColabとPythonを使って、2つのCSVを比較しました。

実際に確認できたのは、

  • 価格変更
  • 在庫変更
  • 新規追加
  • 削除
  • 変更なし
  • 行順が変わったCSV
  • 比較結果CSVの作成

です。

Google Colabを使えば、PythonをPCへインストールせずに実行できます。

また、コードの中で主に変更するのは、

  1. 比較キー
  2. 比較する項目
  3. 結果として表示する項目

の3か所です。

一度自分のCSVに合わせて設定すれば、毎回ファイルを目視で見比べるよりかなり確認しやすくなります。

そして今回は変更部分だけを消し込むのではなく、「変更なし」も含めた比較結果全体をCSVとして残す形にしました。

そのため、Excelで開いてフィルターをかけたり、そのまま確認資料として使ったりすることもできます。

「旧ファイルと新ファイルを毎回目視で比較している」なら、まず試しやすい自動化の一つです。

タイトルとURLをコピーしました