Pandasで NaN
(欠損値)だけを抽出する方法はいくつかあり、目的によって使い分けられます。
ここでは代表的な方法を「行単位」「列単位」「特定の列を対象」に分けて詳しく解説します。
目次
isna()
/ isnull()
を使う基本形
Pandasでは isna()
または isnull()
を使うことで、NaNかどうかを判定できます。
両者は同じ機能です。
import pandas as pd
import numpy as np
# サンプルデータ
df = pd.DataFrame({
"A": [1, 2, np.nan, 4],
"B": [np.nan, 2, 3, np.nan],
"C": [1, np.nan, 3, 4]
})
print("=== 元のデータ ===")
print(df)
出力
A B C
0 1.0 NaN 1.0
1 2.0 2.0 NaN
2 NaN 3.0 3.0
3 4.0 NaN 4.0
NaNだけを抽出する方法
NaN判定(True/Falseのマスク)
print("\n=== NaN判定 ===")
print(df.isna())
出力は同じ形のDataFrameで、NaNなら True
、そうでなければ False
。
特定の列のNaNを含む行を抽出(例: 列A)
例えば列 A
がNaNの行だけ欲しい場合
print("\n=== 列AがNaNの行抽出 ===")
print(df[df["A"].isna()])
複数列のどちらかにNaNがある行を抽出(列AまたはB)
例えば「列Aか列BのどちらかがNaNの行」なら
print("\n=== 列Aまたは列BがNaNの行抽出 ===")
print(df[df[["A","B"]].isna().any(axis=1)])
全ての列がNaNの行を抽出
print("\n=== 全列NaNの行抽出 ===")
print(df[df.isna().all(axis=1)])
where
を使ってNaNだけ残す
もし「NaNの部分だけを抽出したい(それ以外は消す)」なら、where
を使えます。
print("\n=== NaNだけ残す(他はNaNにする) ===")
print(df.where(df.isna()))
このとき、NaN以外はNaNに置き換わるため「NaNの形」を見るときに便利です。
NaNのインデックスを取得(例: 列B)
print("\n=== 列BでNaNの行番号 ===")
print(df[df["B"].isna()].index)
行と列の扱いの違い
- 行方向にNaNを判定 →
axis=1
- 列方向にNaNを判定 →
axis=0
例: NaNを含む列だけ抽出
print("\n=== NaNを含む列だけ抽出 ===")
print(df.loc[:, df.isna().any(axis=0)])
応用例
- NaNの数を数える
print("\n=== 各列のNaN数 ===")
print(df.isna().sum())
- NaNを含む行だけを抽出して別のDataFrameに保存
print("\n=== NaNを含む行のみ抽出 ===")
nan_rows = df[df.isna().any(axis=1)]
print(nan_rows)
まとめ
isna()
/isnull()
でNaNを判定df[col].isna()
→ 特定列のNaN抽出df[df.isna().any(axis=1)]
→ NaNを含む行抽出df.loc[:, df.isna().any(axis=0)]
→ NaNを含む列抽出where
を使えばNaNだけ残したマスク表現が可能
以上、PythonのPandasのNANだけを抽出する方法についてでした。
最後までお読みいただき、ありがとうございました。