データ分析や前処理の現場では、「本来は無効なはずの数値(例:-9999
、0
、9999
)」がそのままデータに残っているケースがよくあります。
これらを 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に変換する方法についてでした。
最後までお読みいただき、ありがとうございました。