データ分析をしていると必ず出会う「欠損値(NaN)」。Pandasには、欠損値を効率的に処理するためのメソッド fillna()
や dropna()
が用意されています。
欠損値とは?
欠損値(NaN: Not a Number)は「データが存在しない状態」を表します。
例:アンケートの未記入、センサーの異常値など。
例
import pandas as pd
import numpy as np
# サンプルデータ(欠損値含む)
data = {
'氏名': ['佐藤', '田中', '鈴木', '高橋'],
'年齢': [28, np.nan, 35, 32],
'出身地': ['東京', '大阪', np.nan, '名古屋']
}
df = pd.DataFrame(data)
print("▼ 元のデータ")
print(df)
出力:
▼ 元のデータ
氏名 年齢 出身地
0 佐藤 28.0 東京
1 田中 NaN 大阪
2 鈴木 35.0 NaN
3 高橋 32.0 名古屋
dropna()
:欠損値を含む行や列を削除する
行単位で削除(デフォルト)
df.dropna()
氏名 年齢 出身地
0 佐藤 28.0 東京
3 高橋 32.0 名古屋
列単位で削除
df.dropna(axis=1)
氏名
0 佐藤
1 田中
2 鈴木
3 高橋
特定の列だけを条件に削除
df.dropna(subset=['年齢'])
氏名 年齢 出身地
0 佐藤 28.0 東京
2 鈴木 35.0 NaN
3 高橋 32.0 名古屋
fillna()
:欠損値を補完する
固定値で埋める
df.fillna({'年齢': 30, '出身地': '不明'})
氏名 年齢 出身地
0 佐藤 28.0 東京
1 田中 30.0 大阪
2 鈴木 35.0 不明
3 高橋 32.0 名古屋
平均値で埋める(年齢列)
df['年齢'] = df['年齢'].fillna(df['年齢'].mean())
print(df)
氏名 年齢 出身地
0 佐藤 28.000000 東京
1 田中 31.666667 大阪
2 鈴木 35.000000 NaN
3 高橋 32.000000 名古屋
欠損の有無を確認する
df.isnull() # True/Falseで欠損の有無を表示
df.isnull().sum() # 各列の欠損数
df[df['年齢'].isnull()] # 特定列の欠損行を抽出
欠損率を確認
df.isnull().mean() * 100
0
氏名 0.0
年齢 25.0
出身地 25.0
dtype: float64
まとめ
-
dropna()
で欠損行や列を削除できる -
fillna()
で柔軟に補完できる(固定値・平均・前後など) - 欠損率のチェックや可視化と組み合わせるとさらに効果的