PythonのPandasのNANだけを抽出する方法について

Python,イメージ

AI実装検定のご案内

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だけを抽出する方法についてでした。

最後までお読みいただき、ありがとうございました。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次