NumPy配列の欠損値np.nanを他の値に置換する方法を徹底解説
データ分析において、**欠損値(Missing Values)**は避けて通れない問題です。NumPy配列では、欠損値は通常np.nan(Not a Number)として表現されます。これらのnp.nanを適切に処理(例えば、他の値に置換)することは、正確な分析結果を得るために非常に重要です。この記事では、NumPy配列のnp.nanを効率的に他の値に置換する様々な方法について、具体的なサンプルコードを交えながら詳しく解説します。
欠損値np.nanとは?
np.nanは、数値計算において「非数」を意味する特殊な浮動小数点値です。これは、無効な演算結果(例: 0/0)や、データが存在しないことを示すために使用されます。np.nanを含む演算結果は、ほとんどの場合np.nanになります。
ポイント: np.nanは、どの値とも等しくないという特性があります。つまり、np.nan == np.nanはFalseを返します。このため、np.nanを検出するには特別な関数が必要です。
np.nanを検出する:np.isnan()
np.nanを他の値に置換する前に、まず配列内のnp.nanを正確に検出する必要があります。これには**np.isnan()**関数が最適です。np.isnan()は、入力配列の各要素がnp.nanであるかどうかをチェックし、結果をブール配列として返します。
サンプルコード
import numpy as np
arr = np.array([1, 2, np.nan, 4, np.nan, 6])
is_nan = np.isnan(arr)
print("NaNの検出結果:", is_nan)
出力例
NaNの検出結果: [False False True False True False]
np.nanを他の値に置換する主要な方法
np.nanを置換する一般的な方法としては、ブールインデックス参照、np.where()、そしてnp.nan_to_num()があります。
1. ブールインデックス参照による置換
np.isnan()で検出したブール配列を使って、直接np.nanの場所を特定し、値を代入する方法です。最もシンプルで直感的な方法の一つです。
サンプルコード
import numpy as np
arr = np.array([1, 2, np.nan, 4, np.nan, 6])
# NaNを0に置換
arr[np.isnan(arr)] = 0
print("NaNを0に置換した配列:", arr)
出力例
NaNを0に置換した配列: [1. 2. 0. 4. 0. 6.]
この方法で、平均値や中央値、あるいは最頻値などの統計量でnp.nanを補完することもできます。
サンプルコード (平均値で補完)
import numpy as np
arr = np.array([1, 2, np.nan, 4, np.nan, 6])
# NaNを除外した配列の平均値を計算
mean_val = np.nanmean(arr)
# NaNを平均値で置換
arr[np.isnan(arr)] = mean_val
print("NaNを平均値で置換した配列:", arr)
出力例
NaNを平均値で置換した配列: [1. 2. 3.2 4. 3.2 6. ]
**np.nanmean()やnp.nanmedian()**のように、欠損値を無視して統計量を計算するNumPy関数も活用できます。
2. np.where()による置換
np.where()関数は、条件に基づいて異なる値を適用する際に非常に便利です。np.isnan()を条件として使用することで、np.nanを効率的に置換できます。
サンプルコード
import numpy as np
arr = np.array([1, 2, np.nan, 4, np.nan, 6])
# NaNであれば99、そうでなければ元の値
replaced_arr = np.where(np.isnan(arr), 99, arr)
print("np.whereでNaNを99に置換:", replaced_arr)
出力例
np.whereでNaNを99に置換: [ 1. 2. 99. 4. 99. 6.]
3. np.nan_to_num()による置換
np.nan_to_num()関数は、配列内のnp.nanをデフォルトで0に、無限大を有限な値(非常に大きい/小さい値)に置換するために特化しています。特定の値を指定して置換することも可能です。
書式
numpy.nan_to_num(x, copy=True, nan=0.0, posinf=None, neginf=None)
-
x: 入力配列。 -
nan:np.nanを置換する値(デフォルトは0.0)。
サンプルコード
import numpy as np
arr = np.array([1, 2, np.nan, 4, np.nan, 6])
# NaNをデフォルト値の0に置換
converted_arr_default = np.nan_to_num(arr)
print("np.nan_to_num (デフォルト):", converted_arr_default)
# NaNを-1に置換
converted_arr_custom = np.nan_to_num(arr, nan=-1)
print("np.nan_to_num (カスタム値):", converted_arr_custom)
出力例
np.nan_to_num (デフォルト): [1. 2. 0. 4. 0. 6.]
np.nan_to_num (カスタム値): [ 1. 2. -1. 4. -1. 6.]
まとめ
NumPy配列の欠損値np.nanを適切に処理することは、データ分析の品質を保つ上で不可欠です。以下に示す主要な方法を理解し、状況に応じて使い分けることが重要です。
-
np.isnan()とブールインデックス参照: 最も一般的で柔軟な方法。特定の統計量(平均、中央値など)で補完する際にも便利です。 -
np.where(): 条件分岐のロジックをより明確に記述したい場合に有効です。 -
np.nan_to_num():np.nanを0や指定した値、無限大を有限な値に効率的に変換したい場合に特化しています。
これらのテクニックをマスターすることで、欠損値を含むデータセットも自信を持って扱えるようになり、より堅牢なデータ分析が可能になるでしょう。ぜひ、あなたのNumPyワークフローで活用してください!
