重複を消す
このレッスンでできるようになること。二重に登録された行を見つけて取り除けるようになります。
売上データの重複は、静かに数字を膨らませます。POS のデータを2回取り込んだ、月をまたいだファイルの範囲が重なっていた、といった理由で、まったく同じ行が2つ入ることがあります。合計を出しても異常には見えないので、目視では気づけません。
見つけるには duplicated() を使います。同じ内容の行が既に上に出ていたら True を返す Series です。既定では2つ目以降を True にします。1つ目は残すべき正しい行だからです。
Python
import pandas as pd
df = pd.read_csv("sales.csv")
dup_count = int(df.duplicated().sum())
df = df.drop_duplicates()drop_duplicates() が実際に消すほうです。既定ではすべての列が一致する行だけを重複と見なします。
ここで大事な判断があります。どの列が一致したら同じ売上なのかは、データによって変わります。売上日と店舗と商品名が同じでも、本当に同じ商品が同じ日に2回売れただけかもしれません。その場合に消してしまうと、正しい売上を捨てることになります。
一部の列だけで判断したいときは subset を渡します。df.drop_duplicates(subset=["伝票番号"]) のように、伝票番号のような一意になるはずの列があれば、それで見るのがいちばん確実です。どちらを残すかは keep で決めます。keep="first" が既定で先頭を残し、keep="last" なら最後を残します。keep=False は重複した行をすべて消すので、「怪しい行を全部よけたい」ときに使います。
drop_duplicates を使うとインデックスに抜けができます。あとで行番号を使うなら reset_index(drop=True) で振り直してください。この演習では、完全に同じ行を重複として数え、取り除きます。
要件
- duplicated で重複している行の件数を数える
- duplicate_count にその件数を int で入れる
- drop_duplicates で重複を取り除き、reset_index(drop=True) で振り直す
- rows に取り除いたあとの行数を int で入れる
- total に取り除いたあとの金額合計を int で入れる
入出力例
remove_duplicates("売上日,店舗,商品名,カテゴリ,数量,金額
2026-01-05,渋谷店,白磁のマグカップ,食器,2,3600
2026-01-06,横浜店,鉄のフライパン,調理器具,1,7800
2026-01-05,渋谷店,白磁のマグカップ,食器,2,3600
2026-01-07,大宮店,積み重ね収納ボックス,収納,3,4500
2026-01-06,横浜店,鉄のフライパン,調理器具,1,7800
") → {"duplicate_count":2,"rows":3,"total":15900}
remove_duplicates("売上日,店舗,商品名,カテゴリ,数量,金額
2026-02-03,渋谷店,鋳物ホーロー鍋,調理器具,1,16800
2026-02-03,渋谷店,鋳物ホーロー鍋,調理器具,1,16800
") → {"duplicate_count":1,"rows":1,"total":16800}