毎月届く価格表や在庫一覧、商品マスターなどを、前回のファイルと見比べながら変更点を探していませんか?
データが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 | 商品A | 1000 | 10 |
| A002 | 商品B | 1500 | 20 |
| A003 | 商品C | 2000 | 15 |
| A005 | 商品E | 2500 | 30 |
新データ:new_products.csv
| 商品コード | 商品名 | 価格 | 在庫 |
|---|---|---|---|
| A001 | 商品A | 1200 | 10 |
| A002 | 商品B | 1500 | 18 |
| A004 | 商品D | 1800 | 8 |
| A005 | 商品E | 2500 | 30 |
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のセル色を比較したい
- 数式の違いを調べたい
- 複数シートをまとめて比較したい
といった場合は、別の処理が必要になります。
新旧ファイルを比較する前に、商品コードなどの表記を揃えておくと差分を判定しやすくなります。

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

まとめ
今回はGoogle ColabとPythonを使って、2つのCSVを比較しました。
実際に確認できたのは、
- 価格変更
- 在庫変更
- 新規追加
- 削除
- 変更なし
- 行順が変わったCSV
- 比較結果CSVの作成
です。
Google Colabを使えば、PythonをPCへインストールせずに実行できます。
また、コードの中で主に変更するのは、
- 比較キー
- 比較する項目
- 結果として表示する項目
の3か所です。
一度自分のCSVに合わせて設定すれば、毎回ファイルを目視で見比べるよりかなり確認しやすくなります。
そして今回は変更部分だけを消し込むのではなく、「変更なし」も含めた比較結果全体をCSVとして残す形にしました。
そのため、Excelで開いてフィルターをかけたり、そのまま確認資料として使ったりすることもできます。
「旧ファイルと新ファイルを毎回目視で比較している」なら、まず試しやすい自動化の一つです。


