PythonのPandasで欠損値扱いの数値をNaNに変換する方法

Python,イメージ

AI実装検定のご案内

データ分析や前処理の現場では、「本来は無効なはずの数値(例:-999909999)」がそのままデータに残っているケースがよくあります。

これらを Pandas で NaN(欠損値)に変換することは、クリーンな分析や機械学習において極めて重要です。

この記事では、特定の数値を NaN に変換する代表的な方法を、コード付きで詳しく紹介します。

目次

まずはサンプルデータの作成

各方法で共通して使用するサンプルデータを用意します。

import pandas as pd
import numpy as np

# サンプルデータ
df = pd.DataFrame({
    'temperature': [22.5, -9999, 23.0, 21.0, -9999],
    'humidity': [55, 60, -9999, 50, 65]
})

print("▶ 元のデータ")
print(df)

方法①:replace() で特定の値をNaNに変換

# -9999 を NaN に変換
df1 = df.copy()
df1.replace(-9999, np.nan, inplace=True)

print("\n▶ replace() による変換結果")
print(df1)

ポイント

  • replace(置換前, 置換後) で明示的な変換が可能
  • inplace=True で元のデータを書き換え

方法②:複数の異常値をまとめてNaNに変換

# -9999、9999、0 を一括で NaN に
df2 = df.copy()
df2.replace([-9999, 9999, 0], np.nan, inplace=True)

print("\n▶ 複数値の replace() での変換結果")
print(df2)

方法③:mask() を使って条件に一致する値をNaNに変換

# 0以下の値を NaN に変換
df3 = df.copy()
df3['temperature'] = df3['temperature'].mask(df3['temperature'] <= 0)
df3['humidity'] = df3['humidity'].mask(df3['humidity'] <= 0)

print("\n▶ mask() による条件付き変換結果")
print(df3)

補足

  • mask(条件) は「条件に一致する値を NaN にする」

方法④:where() を使って逆条件の値をNaNに変換

# 正常値(0より大きい値)だけ残す
df4 = df.copy()
df4['temperature'] = df4['temperature'].where(df4['temperature'] > 0)
df4['humidity'] = df4['humidity'].where(df4['humidity'] > 0)

print("\n▶ where() による条件付き変換結果")
print(df4)

方法⑤:apply() を使ってカスタム関数で変換

# ±100を超える値をNaNに
def clean_value(val):
    if val < -100 or val > 100:
        return np.nan
    return val

df5 = df.copy()
df5['temperature'] = df5['temperature'].apply(clean_value)
df5['humidity'] = df5['humidity'].apply(clean_value)

print("\n▶ apply() による関数ベースの変換結果")
print(df5)

方法⑥:DataFrame.mask() でDataFrame全体に一括変換

# すべての列に対して 0 以下の値を NaN に
df6 = df.copy()
df6 = df6.mask(df6 <= 0)

print("\n▶ DataFrame全体に対する一括 mask() 適用結果")
print(df6)

NaNに変換後の補完処理:fillna() の活用例

# temperature 列の NaN を平均値で埋める
df7 = df6.copy()
df7['temperature'] = df7['temperature'].fillna(df7['temperature'].mean())

print("\n▶ fillna() による欠損値補完(平均値)")
print(df7)

欠損値の確認方法

# 各列の欠損数をカウント
print("\n▶ 各列の欠損値数")
print(df7.isna().sum())

まとめ:状況に応じた使い分け

条件おすすめ手法特徴
特定の値をNaNにしたいreplace()一番シンプルで明示的
範囲条件でNaNにしたいmask() または where()しきい値に基づく除外に便利
複雑な条件や判定が必要apply()関数ベースで自由度が高い
全体を一括で条件変換df.mask()DataFrame全体への適用が可能

おわりに

特定の数値を欠損値として正しく扱うことは、Pandasを使ったデータ分析の基礎でありながら非常に重要な工程です。

これを怠ると、統計処理や可視化、機械学習モデルの精度に重大な影響を与えかねません。

本記事で紹介したコードを組み合わせれば、多様なデータクリーニングニーズに柔軟に対応できます。

あなたのプロジェクトにもぜひ取り入れてみてください。

以上、PythonのPandasで欠損値扱いの数値をNaNに変換する方法についてでした。

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

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