重複を消す
このレッスンでできるようになること。二重に登録された行を見つけて取り除けるようになります。
売上データの重複は、静かに数字を膨らませます。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 で入れる