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ワークフローで活用してください!