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.nanFalseを返します。このため、np.nanを検出するには特別な関数が必要です。


 

np.nanを検出する:np.isnan()

 

np.nanを他の値に置換する前に、まず配列内のnp.nanを正確に検出する必要があります。これには**np.isnan()**関数が最適です。np.isnan()は、入力配列の各要素がnp.nanであるかどうかをチェックし、結果をブール配列として返します。

 

サンプルコード

 

Python
 
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の場所を特定し、値を代入する方法です。最もシンプルで直感的な方法の一つです。

 

サンプルコード

 

Python
 
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を補完することもできます。

 

サンプルコード (平均値で補完)

 

Python
 
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を効率的に置換できます。

 

サンプルコード

 

Python
 
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に、無限大を有限な値(非常に大きい/小さい値)に置換するために特化しています。特定の値を指定して置換することも可能です。

 

書式

 

Python
 
numpy.nan_to_num(x, copy=True, nan=0.0, posinf=None, neginf=None)
  • x: 入力配列。

  • nan: np.nanを置換する値(デフォルトは0.0)。

 

サンプルコード

 

Python
 
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.nan0や指定した値、無限大を有限な値に効率的に変換したい場合に特化しています。

これらのテクニックをマスターすることで、欠損値を含むデータセットも自信を持って扱えるようになり、より堅牢なデータ分析が可能になるでしょう。ぜひ、あなたのNumPyワークフローで活用してください!