欠損を埋める・落とす
このレッスンでできるようになること。欠損を埋めるか落とすかを自分で判断し、fillna と dropna で処理できるようになります。
欠損を見つけたら、次は扱いを決めます。方法は2つしかありません。埋めるか落とすかです。
fillna は埋めます。df["数量"].fillna(0) で欠損が0になります。平均で埋めたいなら df["数量"].fillna(df["数量"].mean()) です。列ごとに違う値で埋めたいときは、辞書を渡して df.fillna({"数量": 0, "カテゴリ": "未分類"}) と書けます。
dropna は落とします。df.dropna() は欠損を1つでも含む行をすべて消します。特定の列だけを見て判断したいときは df.dropna(subset=["金額"]) のように書きます。金額が無い売上は分析のしようがないので、この形はよく使います。
どちらを選ぶかは、その列が何を意味するかで決めます。判断の目安は次のとおりです。
数量が欠けている売上は、金額があるなら記録漏れなので、0で埋めるとかえって嘘になります。この場合は落とすか、1で埋めるという業務上の合意を作ります。カテゴリが欠けている場合は「未分類」で埋めておけば、集計から消えずに済みます。金額が欠けている行は、売上分析の対象になりません。落とすのが自然です。
やってはいけないのは、何も考えず全部0で埋めることです。平均が下がり、合計は変わらず、比較すると数字が合わない、という追いにくいずれ方をします。
Python
import pandas as pd
df = pd.read_csv("sales.csv")
df = df.dropna(subset=["金額"])
df = df.fillna({"カテゴリ": "未分類"})fillna も dropna も元の df を変えません。必ず代入し直してください。この演習では、金額の欠損は落とし、カテゴリの欠損は「未分類」で埋め、数量の欠損は0で埋めます。
要件
- dropna の subset で金額が欠けている行を落とす
- fillna にカテゴリと数量の埋め方を辞書で渡す
- rows に処理後の行数を int で入れる
- remaining_na に処理後の欠損の合計を int で入れる
- categories にカテゴリ列の値のリストを入れる
入出力例
clean_missing("売上日,店舗,商品名,カテゴリ,数量,金額
2026-01-05,渋谷店,白磁のマグカップ,食器,2,3600
2026-01-06,横浜店,鉄のフライパン,,1,7800
2026-01-07,大宮店,積み重ね収納ボックス,収納,,4500
2026-01-08,渋谷店,木製カッティングボード,調理器具,1,4200
2026-01-09,横浜店,白磁のマグカップ,食器,,7200
") → {"categories":["食器","未分類","収納","調理器具","食器"],"remaining_na":0,"rows":5}
clean_missing("売上日,店舗,商品名,カテゴリ,数量,金額
2026-02-03,渋谷店,鋳物ホーロー鍋,調理器具,1,16800
2026-02-04,大宮店,白磁のマグカップ,,5,9000
") → {"categories":["調理器具","未分類"],"remaining_na":0,"rows":2}