欠損を見つける
このレッスンでできるようになること。どの列に何件の欠損があるかを数えられるようになります。
ここからの3章は前処理です。現場から届く CSV は、たいてい素直ではありません。入力し忘れた欄、二重に登録された行、金額に付いた円マーク。これらを掃除しないと、集計した数字が静かに間違います。
いちばん多いのが欠損です。CSV で値が書かれていない欄は、pandas が NaN という特別な値として読み込みます。Not a Number の略で、「値が無い」という印です。
やっかいなのは、NaN が混ざっていても pandas はエラーを出さないことです。合計を出せば NaN の行を飛ばして計算してくれます。親切なようですが、5件のうち2件が欠けている平均を「全体の平均」だと思い込むと、判断を間違えます。だから欠損は、集計の前に数えて把握するのが鉄則です。
数えるには isna() を使います。値が欠損なら True、そうでなければ False が返るので、DataFrame と同じ形の True と False の表になります。
Python
import pandas as pd
df = pd.read_csv("sales.csv")
missing = df.isna().sum()sum() は True を1、False を0として足すので、列ごとの欠損件数が Series で返ります。この2行は前処理の入口として毎回書くことになります。
全体で何件欠けているかを知りたいときは df.isna().sum().sum() と2回続けます。1回目で列ごと、2回目でその合計です。逆に「欠損が無い」ことを確かめたいなら df.isna().any().any() が False であることを見ます。
欠損のある行を見たいときは df[df["数量"].isna()] のように、前章のブールインデックスがそのまま使えます。どんな行で欠けているのかを目で見ると、原因が分かることがあります。この演習では、列ごとの欠損件数と全体の件数を求めます。
要件
- isna と sum で列ごとの欠損件数を求める
- by_column に列名をキーにした欠損件数の辞書を入れる
- total に全体の欠損件数を int で入れる
- rows_with_na に欠損を1つ以上含む行の件数を int で入れる
入出力例
count_missing("売上日,店舗,商品名,カテゴリ,数量,金額
2026-01-05,渋谷店,白磁のマグカップ,食器,2,3600
2026-01-06,横浜店,鉄のフライパン,,1,7800
2026-01-07,大宮店,積み重ね収納ボックス,収納,,4500
2026-01-08,渋谷店,木製カッティングボード,調理器具,1,4200
2026-01-09,横浜店,白磁のマグカップ,食器,,7200
") → {"by_column":{"カテゴリ":1,"商品名":0,"売上日":0,"店舗":0,"数量":2,"金額":0},"rows_with_na":3,"total":3}
count_missing("売上日,店舗,商品名,カテゴリ,数量,金額
2026-02-03,渋谷店,鋳物ホーロー鍋,調理器具,1,16800
2026-02-04,大宮店,白磁のマグカップ,,5,9000
") → {"by_column":{"カテゴリ":1,"商品名":0,"売上日":0,"店舗":0,"数量":0,"金額":0},"rows_with_na":1,"total":1}