データ分析の現場において、最初に取り組むべき重要なステップの一つが「欠損値の確認」です。
データセットに欠損値(NaNやNone)が含まれたまま解析を進めると、計算結果に誤差が生じたり、機械学習モデルの学習が失敗したりする原因となります。
Pythonのデータ解析ライブラリであるPandasには、欠損値を効率的に検出し、把握するための強力な関数が多数用意されています。
本記事では、欠損値確認の基本となるisna関数やisnull関数の使い方から、実務で役立つ応用的な集計テクニックまで詳しく解説します。
2026年現在のデータ分析実務においても、これらの手法を正しく使い分けることは必須のスキルと言えるでしょう。
Pandasにおける欠損値の定義と表現
Pandasでは、欠損値は主に「NaN(Not a Number)」として表現されます。
これは浮動小数点型の数値データにおいて、値が存在しないことを示す標準的なマーカーです。
また、Python標準のNoneや、Pandas 1.0以降で導入された新しい欠損値型であるpd.NAも欠損値として扱われます。
これらの値は、一般的な「0」や「空文字」とは本質的に異なるものです。
データの中に含まれるこれらの欠損値を正確に特定することが、データクレンジングの第一歩となります。
Pandasでは、これらの異なる形式の欠損値を共通のメソッドで一括して検出できるよう設計されています。
欠損値を確認する基本関数:isnaとisnull
Pandasで欠損値を検出する際、最も頻繁に使用されるのがisna()メソッドとisnull()メソッドです。
これら二つの関数は、機能的に全く同じものであり、どちらを使用しても結果に違いはありません。
R言語などの他の統計言語に馴染みがあるユーザーのために、複数の名称が用意されているという背景があります。
一般的には、Pythonらしい命名規則に近いisna()が好んで使われる傾向にあります。
isna関数の基本的な使い方
まずは、データフレーム全体に対してisna()を適用する例を見てみましょう。
このメソッドを実行すると、元のデータフレームと同じ形状のデータフレームが返されます。
各要素が欠損値であればTrue、値が存在すればFalseが格納されています。
import pandas as pd
import numpy as np
# サンプルデータの作成
df = pd.DataFrame({
'A': [1, 2, np.nan, 4],
'B': [np.nan, 'apple', 'banana', None],
'C': [10.5, np.nan, 20.1, 15.3]
})
# 欠損値の判定を実行
print(df.isna())
A B C
0 False True False
1 False False True
2 True False False
3 False True False
このように、すべての要素に対して個別に判定が行われることがわかります。
欠損値の合計数を列ごとに集計する
データセットが大規模な場合、各要素をTrue/Falseで確認するのは現実的ではありません。
そのため、一般的にはsum()メソッドと組み合わせて列ごとの欠損値数を集計します。
Pythonでは、Trueは1、Falseは0として計算される性質を利用しています。
# 各列の欠損値の合計を取得
null_counts = df.isna().sum()
print(null_counts)
A 1
B 2
C 1
dtype: int64
この結果から、どの列にどれだけの欠損値が含まれているのかを一目で把握できます。
特定の列に欠損値が集中している場合、その特徴量の削除や補完方法を検討する材料となります。
欠損値の割合を算出する方法
欠損値の「数」だけでなく、データ全体に対する「割合」を確認することも重要です。
割合を確認するには、mean()メソッドを使用するのが最も簡単です。
# 各列の欠損値の割合を算出
null_ratio = df.isna().mean()
print(null_ratio)
A 0.25
B 0.50
C 0.25
dtype: float64
たとえば、欠損率が50%を超えるような列は、分析の信頼性を損なう可能性があるため、除外を検討することになります。
逆に欠損率が極めて低い場合は、単純な中央値や平均値での補完が効果的です。
データフレーム全体の欠損値の有無を確認する
データフレームのどこかに1つでも欠損値があるかどうかを知りたい場合には、any()メソッドを活用します。
any()を1回適用すると列ごとの判定になり、2回重ねて適用するとデータフレーム全体の判定になります。
# 1つでも欠損値がある列を確認
print(df.isna().any())
# データフレーム全体に1つでも欠損値があるか確認
print(df.isna().any().any())
A True
B True
C True
dtype: bool
True
バリデーションチェックの一環として、この処理をスクリプト内に組み込むことが多いです。
欠損値が存在してはいけない最終段階のデータチェックなどに非常に便利です。
行単位での欠損値確認
列方向ではなく、行方向(レコード単位)に欠損値を集計したい場合もあります。
その場合は、メソッドの引数にaxis=1を指定します。
# 各行に含まれる欠損値の数を確認
row_null_counts = df.isna().sum(axis=1)
print(row_null_counts)
0 1
1 1
2 1
3 1
dtype: int64
特定のユーザーデータにおいて、ほとんどの項目が入力されていない行を特定する際などに有効です。
欠損値を含む行を抽出(フィルタリング)する
欠損値が含まれている行だけを実際に目で見て確認したい場合、ブールインデックス参照を利用します。
「特定の列に欠損値がある行」を抽出するコードは以下の通りです。
# 列 'A' が欠損値である行を抽出
null_rows = df[df['A'].isna()]
print(null_rows)
A B C
2 NaN banana 20.1
これにより、なぜデータが欠落しているのか、他の列の値から推測することが可能になります。
非欠損値を確認するnotnaメソッド
欠損値ではない、つまり「有効な値」がどれだけあるかを確認したい場合には、notna()メソッドを使用します。
これはisna()と完全に反転した結果を返します。
# 有効な値の数を確認
valid_counts = df.notna().sum()
print(valid_counts)
A 3
B 2
C 3
dtype: int64
データの密度を確認したいときや、有効なデータのみをフィルタリングしたい場合に多用されます。
info()メソッドによる一括確認
個別の列を詳細に調べる前に、データフレームの全体像を素早く把握するにはinfo()メソッドが適しています。
info()を実行すると、各列のデータ型とともに、「非欠損値の数(Non-Null Count)」が表示されます。
# データフレームの要約情報を表示
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 4 entries, 0 to 3
Data columns (total 3 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 A 3 non-null float64
1 B 2 non-null object
2 C 3 non-null float64
dtypes: float64(2), object(1)
memory usage: 224.0+ bytes
これを見れば、全体のレコード数に対してどの程度の欠損があるかを即座に比較検討できます。
型の違いによる欠損値の挙動
Pandasの欠損値確認において注意すべき点は、データの型(dtype)による違いです。
従来のfloat64やobject型では、np.nanやNoneが混在しても柔軟に扱えます。
しかし、標準のint64型は欠損値を保持することができません。
整数列に欠損値が含まれる場合、列全体の型が自動的に浮動小数点型(float64)に変換されてしまうことがあります。
これを防ぐためには、Pandas 1.0以降で利用可能な「Nullable Integer型」を明示的に指定する必要があります。
# Nullable Integer型の使用例
df_int = pd.Series([1, 2, None], dtype="Int64")
print(df_int.isna())
0 False
1 False
2 True
dtype: bool
型を維持したまま欠損値を管理できるため、2026年のモダンな開発環境ではこのNullable型の利用が一般的になっています。
まとめ
Pandasにおける欠損値の確認は、データ分析の品質を担保するための最も基本的な作業です。
isna()やisnull()をベースに、sum()やmean()を組み合わせることで、データの不備を多角的に分析できます。
また、列単位だけでなく行単位の集計や、info()による全体俯瞰、ブールインデックスによる抽出をマスターすれば、データクレンジングの効率は劇的に向上します。
まずはdf.isna().sum()を実行する習慣をつけ、常にデータの欠損状況を把握するように心がけましょう。
適切な欠損値処理を行うことで、より精度の高いデータ分析や機械学習モデルの構築が可能になります。
