実データにはたいてい欠損値が含まれています。欠損値を放置したまま集計や分析を進めると、結果が歪んでしまうことがあるため、まずはどこに欠損があるかを正確に把握することが大切です。pandas では isna と notna を使って欠損値を検出します。
isna で欠損を検出する
isna メソッドは、各セルが欠損値(NaN)であれば True、そうでなければ False を返します。
import pandas as pd
import numpy as np
df = pd.DataFrame({
"name": ["Alice", "Bob", None],
"age": [25, np.nan, 35],
"city": ["Tokyo", "Osaka", "Nagoya"]
})
print(df.isna())
すべてのセルに対して真偽値の DataFrame が返ります。視覚的にどこが欠けているかを確認できますが、データが大きいときはこの結果を眺めるだけでは非効率です。
列ごとの欠損数を数える
isna の結果に sum を組み合わせると、列ごとの欠損数がわかります。
print(df.isna().sum())
True は 1、False は 0 として扱われるため、sum で欠損の件数が得られるしくみです。さらに全体の欠損率を知りたければ mean を使います。
print(df.isna().mean())
0.33 と出れば 33% が欠損していることを意味します。欠損率が高すぎる列は、分析から除外するか補間方法を慎重に検討する必要があるでしょう。
notna で欠損でないセルを検出する
notna は isna の逆で、値が存在するセルに True を返します。
print(df.notna())
条件フィルタリングと組み合わせるときに notna が便利です。たとえば、age 列に値がある行だけを抽出するには次のように書きます。
df_valid = df[df["age"].notna()]
print(df_valid)
欠損している箇所を True で返す。欠損の検出に使う
値が存在する箇所を True で返す。有効データの抽出に使う
any と all で欠損の有無を判定する
1 つでも欠損がある列を調べるには any を使います。
print(df.isna().any())
逆に、すべてが欠損している列を調べるには all が使えます。全欠損の列はデータとしての価値がないため、早めに drop しておくのが一般的です。
欠損値の検出はデータ前処理の出発点にあたります。isna と notna で現状を把握したうえで、dropna による削除や fillna による補間といった次のステップに進むのがスムーズな流れです。