note.nkmk.me

NumPyの配列ndarrayの欠損値np.nanを他の値に置換

Date: 2018-01-30 / tags: Python, NumPy

NumPyの配列ndarrayの欠損値np.nanを他の値に置換する場合、np.isnan()を利用したブールインデックス参照を行う。任意の値に置き換えたり、np.nanを除外した値の平均値に置き換えたりできる。

なお、欠損値np.nanを他の値で置換するのではなく削除する場合は、以下の記事を参照。

また、pandasを使う場合は、欠損値を操作する方法が別途用意されている。

例として、データが欠落した以下のcsvをnp.genfromtxt()で読み込んで使う。欠落箇所が欠損値np.nanとなる。

import numpy as np

arr = np.genfromtxt('data/src/sample_nan.csv', delimiter=',')
print(arr)
# [[ 11.  12.  nan  14.]
#  [ 21.  nan  nan  24.]
#  [ 31.  32.  33.  34.]]
スポンサーリンク

genfromtxt()の引数filling_valuesを指定

元となるcsvファイルのデータが欠落している場合、np.genfromtxt()で読み込むときに引数filling_valuesを指定すると、欠落箇所を任意の値で埋めることができる。

例えば、0で埋めたい場合は以下の通り。

arr_fill = np.genfromtxt('data/src/sample_nan.csv', delimiter=',', filling_values=0)
print(arr_fill)
# [[ 11.  12.   0.  14.]
#  [ 21.   0.   0.  24.]
#  [ 31.  32.  33.  34.]]

ブールインデックス参照で欠損値np.nanを置換

欠損値np.nanか否かを判定する関数np.isnan()を使って、np.nanの位置がTrueとなるndarrayを取得できる。

print(np.isnan(arr))
# [[False False  True False]
#  [False  True  True False]
#  [False False False False]]

これを利用して、欠損値np.nanの位置に任意の値を代入することで、np.nanを置き換えることができる。

0に置換したい場合は以下の通り。

arr[np.isnan(arr)] = 0
print(arr)
# [[ 11.  12.   0.  14.]
#  [ 21.   0.   0.  24.]
#  [ 31.  32.  33.  34.]]

欠損値np.nanを除外した値の平均を算出する関数np.nanmean()を利用して、平均値に置き換えることも可能。

arr = np.genfromtxt('data/src/sample_nan.csv', delimiter=',')
arr[np.isnan(arr)] = np.nanmean(arr)
print(arr)
# [[ 11.          12.          23.55555556  14.        ]
#  [ 21.          23.55555556  23.55555556  24.        ]
#  [ 31.          32.          33.          34.        ]]
スポンサーリンク
シェア
このエントリーをはてなブックマークに追加

関連カテゴリー

関連記事