この記事でわかること

  • 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で重複を探します
  • 重複した行は、消す前に一覧にして、本当に同じかを確かめます
  • 大文字と小文字、前後の空白をそろえた照合用の列で比べます
  • 重複を除いた表は、元のファイルとは別の名前で保存します