本文へスキップ
BecomeCoder

Pythonデータ分析コース · 第4章 pandas ― 集計と加工 · レッスン16

欠損値の扱い ― isna / fillna / dropna

ブラウザで完結

導入

現実のデータには、値が抜けている「欠損値(NaN)」がつきものです。これを放置すると集計が狂うので、見つけて対処する方法を学びます。

説明

欠損は NaN(Not a Number)で表されます。isna() で「どこが欠損か」、isna().sum() で「列ごとの欠損数」が分かります。

import pandas as pd
import numpy as np

df = pd.DataFrame({
    "name": ["A", "B", "C", "D"],
    "score": [80, np.nan, 70, np.nan],
})
print(df)
print("--- 欠損の数 ---")
print(df.isna().sum())

対処は主に2つ。fillna(値)埋めるか、dropna()その行を捨てるかです。

import pandas as pd
import numpy as np

df = pd.DataFrame({
    "name": ["A", "B", "C", "D"],
    "score": [80, np.nan, 70, np.nan],
})
print("--- 平均で埋める ---")
print(df.fillna(df["score"].mean()))
print("--- 欠損行を捨てる ---")
print(df.dropna())

欠損を平均値で埋める fillna(df["score"].mean()) は、データを減らさずに済む定番の手当てです。どちらを選ぶかは分析の目的しだいです。

ちなみに、mean() などの集計は欠損を自動で無視して計算してくれます。とはいえ、欠損の有無は必ず自分の目で確認しておくのが安全です。

やってみよう

df.fillna(0) で欠損を0埋めしたときと、平均で埋めたときで、score の平均がどう変わるか比べてみましょう。

演習

上の df について、dropna() で欠損のある行を取り除いた表を表示してください。

ヒント1を見る

df.dropna() をそのまま print します。

実際に動かしてみよう

下のエディタにPythonを書いて「実行」を押すと、numpy・pandas・matplotlib が使える本物のPython(Pyodide)で出力とグラフが表示されます。初回だけ読み込みに少し時間がかかります。本文の例をそのまま試したり、書き換えたりしてみましょう(グラフ内の文字は日本語だと表示が崩れるため英字で書きます)。

Python — ライブラリ付きで実行(Pyodide)

numpy / pandas / matplotlib が使える本物のPython(Pyodide)を読み込みます。初回のみ読み込みに少し時間がかかります(以降はブラウザにキャッシュされます)。
スクロールして表示された時点でも自動で読み込まれます。