PythonでExcelの重複データを見つける手順|消す前に確かめて残す
PythonでExcelの重複データを見つける手順を解説します。pandasで名簿の重複を一覧にして確かめ、重複を除いた表を別のファイルに保存するまでを、表記の揺れや比べる列の選び方のつまずきとあわせて紹介します。
本記事はプロモーションを含みます。紹介する情報は、実際の成果や効果を保証するものではありません。
目次
この記事でわかること
- PythonでExcelの表から重複したデータを見つける手順
- 重複を消す前に一覧にして確かめる方法
- 重複を除いた表を、元のファイルとは別に保存する方法
- 重複がうまく見つからないときのつまずき
名簿や取引の表に、同じ人やデータが2回入っていることがあります。Excelで並べ替えて目で探すと、見落としや消し間違いが起きやすくなります。この記事では、Pythonの pandas というライブラリで、重複を見つけて確かめ、重複を除いた表を保存する最小の手順を紹介します。
外部の情報は、pandas の公式の資料で確かめた内容だけを書きます。CSVで項目ごとの件数と合計を出す手順は、PythonでCSVを集計する手順で紹介しています。
先に結論: 消す前に一覧にして確かめる
先に結論を書くと、どの列で重複とみなすかを決め、重複した行を一覧にして確かめてから、重複を除いた表を別のファイルに保存します。 元のファイルは書き換えません。
| やること | 担当 |
|---|---|
| 比べる列を決める | 人 |
| 重複の一覧 | Python |
| 一覧を確かめる | 人 |
| 除いた表の保存 | Python |
例にする名簿
この記事では、次のような架空の名簿を例にします。氏名・メール・登録日の3つの列があり、同じ人が別の日にもう一度登録されている行があります。
- 氏名: 山田太郎など
- メール: 架空のメールアドレス
- 登録日: 2026-09-01 のような日付
同じ人でも登録日が違うので、行全体では同じになりません。そこで、1人に1つ決まるメールの列で比べます。実際のデータで試す前に、同じ形の架空の名簿で試します。
手順: 重複を一覧にして、除いた表を保存する
次のコードは、customers.xlsx を読み、メールが同じ行を重複として一覧にし、duplicates.xlsx に保存します。そのうえで、最初の行だけを残した表を customers_clean.xlsx に保存します。customers.xlsx そのものには手を加えない作りです。
# 名簿の重複を一覧にしてから、除いた表を別に保存する
import pandas as pd
df = pd.read_excel("customers.xlsx")
df["照合用"] = df["メール"].str.strip().str.lower()
dup = df[df.duplicated(subset=["照合用"], keep=False)]
print("行数", len(df), "重複の行", len(dup))
dup.sort_values("照合用").to_excel("duplicates.xlsx",
index=False)
clean = df.drop_duplicates(subset=["照合用"], keep="first")
clean = clean.drop(columns="照合用")
print("残る行", len(clean), "消える行", len(df) - len(clean))
clean.to_excel("customers_clean.xlsx", index=False)
read_excel は、pandas の公式の資料で、Excel のファイルを読み込んで DataFrame にする関数と説明されています。duplicated は重複した行を True で示し、drop_duplicates は重複した行を取り除いた表を返します。
- 照合用の列: メールの前後の空白を取り除き、小文字にそろえた列です。比べるためだけに使います
- subset: 重複かどうかを、指定した列だけで判断する指定です。指定しないと、すべての列で比べます
- keep=False: 重複したすべての行を一覧に入れる指定です
- keep="first": 重複した行のうち、最初に出てくる行を残す指定です
架空の7行の名簿で試すと、重複の行は6、残る行は4、消える行は3で、元の customers.xlsx は変わりませんでした。使った版は、Python が 3.12.10、pandas が 3.0.6、openpyxl が 3.1.5 です(作業PC)。
消す前に確かめること
重複を除いた表を使う前に、duplicates.xlsx を開いて、次の2つを確かめます。
- 本当に同じ人か: メールが同じでも、家族で1つのアドレスを使っているなど、別の人のことがあります
- どの行を残すか: 最初の行を残すと、古い登録日の行が残ります。新しい行を残したいときは、keep に "last" を指定します
確かめた結果、消してはいけない行があれば、customers_clean.xlsx ではなく元のファイルを手で直します。
Pythonで調べるかの判断
迷ったときは、「同じ形の表で、重複の確認をこれからもくり返すか」で決めます。毎月の名簿や取引の一覧で確かめるなら、手順をコードにしておくと、毎回同じ基準で一覧を作れます。1回だけなら、Excel の重複の削除の機能で足りることもあります。どちらの場合も、消す前に一覧で確かめる順番は同じです。
つまずきやすいところ
- 比べる列を指定しない: subset を指定しないと、すべての列で比べます。架空の名簿で試したときも、登録日の違う行は重複にならず、見つかった重複は1行だけでした
- keep の初期の設定のまま一覧を作る: duplicated の初期の設定では、最初の行以外だけに印が付きます。架空の名簿でも、初期の設定では重複の行が3、keep=False では6でした
- 表記の揺れを見落とす: 大文字と小文字、前後の空白が違うと、別の値になります。架空の名簿で、照合用の列を作らずにメールの列のまま比べると、重複の行は4で、大文字と空白の違う1組を見落としました
- 元のファイルに上書きする: pandas の資料では、同じ名前のファイルがあると上書きされるとしています。保存するファイルの名前は、元のファイルと分けます
2つのファイルの違いを見つけたいときは、2つのExcelファイルを比較する方法が参考になります。複数のファイルを1つにまとめた後に重複を調べるときは、Excelの複数ファイルを1つにまとめる方法と組み合わせて使えます。
まとめ
- どの列で重複とみなすかを決めてから、Pythonで重複を探します
- 重複した行は、消す前に一覧にして、本当に同じかを確かめます
- 大文字と小文字、前後の空白をそろえた照合用の列で比べます
- 重複を除いた表は、元のファイルとは別の名前で保存します
よくある質問
重複を見つけるとき、どの列で比べればよいですか?
同じ人や同じ取引だと判断できる列で比べます。名簿ならメールアドレスのように、1人に1つ決まる列が向いています。日付など毎回変わる列まで含めると、重複として見つかりません。
重複した行のうち、どれが残りますか?
この記事のコードでは、最初に出てくる行を残します。drop_duplicates の keep に "last" を指定すると、最後に出てくる行を残せます。
大文字と小文字や、前後の空白の違いは重複として見つかりますか?
そのままでは見つかりません。文字が1つでも違えば、別の値として扱われます。比べる前に、前後の空白を取り除き、小文字にそろえた列を作って比べます。
元のExcelファイルは書き換わりますか?
この記事のコードは、重複の一覧と重複を除いた表を、別の名前のファイルに保存します。元のファイルと同じ名前で保存すると上書きされるので、名前を分けます。
Pythonを学んだことがなくても使えますか?
コードはAIに書いてもらうこともできます。ただし、架空のデータで動かして、重複の件数と残る行数が正しいかを自分で確かめてから使います。