CSVデータを扱っていると、いつの間にか同じデータが複数行入っていることがあります。
数十行ならExcelで確認できますが、数千〜数万行になると目視での確認は現実的ではありません。
Pythonの pandas を使えば、CSVの重複確認から削除、結果の保存まで簡単に自動化できます。
この記事では、
- CSVに重複があるか確認する
- 完全に同じ行を削除する
- 特定の列を基準に重複を削除する
- 複数列を使って重複を判定する
- 元データを壊さず保存する
- CSVの文字コード問題に対応する
という実務で使いやすい方法を紹介します。
1. pandasをインストールする
まだpandasをインストールしていない場合は、次のコマンドを実行します。
pip install pandas
Pythonから読み込みます。
import pandas as pd
2. CSVファイルを読み込む
まずCSVを読み込みます。
import pandas as pd
df = pd.read_csv("input.csv")
print(df.head())
print("行数:", len(df))
処理前の行数を記録しておくと、後で何行削除されたのか確認できます。
3. 重複している行を確認する
いきなり削除するのではなく、まず重複を確認します。
duplicates = df[df.duplicated()]
print(duplicates)
重複行の件数だけ確認する場合は、
print("重複行数:", df.duplicated().sum())
で確認できます。
実務データでは、削除前に「何が重複しているのか」を確認しておく方が安全です。
4. 完全に同じ行を削除する
すべての列が同じ行を重複として削除する場合は、drop_duplicates() を使います。
cleaned = df.drop_duplicates()
print("処理前:", len(df))
print("処理後:", len(cleaned))
print("削除数:", len(df) - len(cleaned))
例えば1000行のCSVから50行の重複が削除された場合、
処理前: 1000
処理後: 950
削除数: 50
となります。
元の df を直接変更せず、cleaned という別の変数に結果を入れておくと確認しやすくなります。
5. 特定の列を基準に重複を削除する
実際の業務では「行全体が同じか」ではなく、顧客IDやメールアドレスなどを基準に重複を判定したい場合があります。
例えば次のようなCSVです。
customer_id,name,email
1001,田中太郎,tanaka@example.com
1002,山田花子,yamada@example.com
1001,田中太郎,tanaka@example.com
customer_id を基準に重複を削除する場合は、
cleaned = df.drop_duplicates(
subset=["customer_id"],
keep="first"
)
とします。
keep="first" は最初に出てきたデータを残します。
最後のデータを残したい場合は、
cleaned = df.drop_duplicates(
subset=["customer_id"],
keep="last"
)
とします。
6. 複数の列を使って重複判定する
名前だけを基準にすると、同姓同名の別人まで削除してしまう可能性があります。
その場合は複数列を指定します。
cleaned = df.drop_duplicates(
subset=["name", "email"],
keep="first"
)
これなら、
名前とメールアドレスの両方が一致した場合
だけ重複として扱えます。
CSVの重複削除では、プログラムそのものよりも、
何をもって「同じデータ」と判断するのか
を最初に決めることが重要です。
7. 重複データをすべて確認する
削除対象になりそうなデータをまとめて確認したい場合は、
duplicates = df[
df.duplicated(
subset=["customer_id"],
keep=False
)
]
print(duplicates)
とします。
keep=False を指定すると、重複しているグループ全体を確認できます。
削除前のチェックに便利です。
8. 元CSVを上書きしない
業務データを扱う場合、いきなり元ファイルを上書きするのはおすすめしません。
別ファイルとして保存します。
cleaned.to_csv(
"output.csv",
index=False,
encoding="utf-8-sig"
)
これなら、
input.csv ← 元データ
output.csv ← 重複削除後
という形で両方を残せます。
9. CSVの文字コードにも注意する
CSV処理で意外と多いのが文字コードの問題です。
例えばWindowsやExcelから出力されたCSVでは、UTF-8ではなくCP932(Shift_JIS系)が使われていることがあります。
UTF-8で読み込めない場合は、
df = pd.read_csv(
"input.csv",
encoding="cp932"
)
を試せます。
逆に、処理後のCSVをExcelでも開きやすくしたい場合は、
cleaned.to_csv(
"output.csv",
index=False,
encoding="utf-8-sig"
)
のように保存できます。
10. 実務では「重複削除だけ」で終わらない
実際のCSVデータでは、単純な重複以外にも、
- 文字コードの違い
- 不要な空白
- 空欄
- NULL
- 列の不足
- 表記揺れ
- Excel由来のデータ
- 同じ顧客なのに表記が違う
などが混在することがあります。
例えば、
株式会社ABC
(株)ABC
株式会社ABC
株式会社ABC
は、人間には同じ会社に見えても、そのままでは別の文字列として扱われます。
そのため実務では、
CSV読み込み
↓
文字コード確認
↓
データ整形
↓
重複判定
↓
重複削除
↓
件数確認
↓
別ファイルへ保存
という順番で処理した方が安全です。
11. 最小構成ならこれだけでも使える
単純に完全一致する重複行を削除するだけなら、次のコードで処理できます。
import pandas as pd
input_file = "input.csv"
output_file = "output.csv"
df = pd.read_csv(input_file)
before = len(df)
cleaned = df.drop_duplicates()
after = len(cleaned)
cleaned.to_csv(
output_file,
index=False,
encoding="utf-8-sig"
)
print("処理前:", before)
print("処理後:", after)
print("削除数:", before - after)
print("出力:", output_file)
これだけでも、手作業で重複行を探すよりかなり楽になります。
12. 定型的なCSV作業は自動化できる
毎日・毎週同じようなCSV整理をしている場合、
CSVを受け取る
↓
内容をチェック
↓
重複を削除
↓
CSVを生成
↓
結果を返す
まで自動化できます。
私自身も、この考え方を使ってCSV処理を自動化する仕組みを構築しています。
Python環境を用意せず、CSVファイルをアップロードして重複削除を行いたい場合は、こちらでも試せるようにしています。
ブラウザからCSVを処理する場合
Python環境を用意せずにCSVの重複削除を行いたい場合は、こちらから利用できます。
まとめ
CSVの重複削除自体は、pandasなら非常に簡単です。
cleaned = df.drop_duplicates()
ただし実務では、
- 何を重複と判断するか
- どのデータを残すか
- 文字コードをどうするか
- 元ファイルを保護するか
- 処理前後の件数を確認するか
まで考えることが重要です。
特に業務データでは、いきなり削除するのではなく、
確認 → 重複判定 → 削除 → 件数確認 → 別ファイル保存
という流れにしておくと安全です。