note.nkmk.me

NumPyの配列ndarrayの欠損値np.nanを含む行や列を削除

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

NumPyの配列ndarrayの欠損値np.nanを含む行または列を削除(除外)する場合、np.isnan()で欠損値np.nanを判定し、any()を使って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.]]
スポンサーリンク

欠損値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]]

このndarrayに否定演算子~を使ってnp.nanの位置をFalseとすることでnp.nanを削除することができるが、残る要素の個数がバラバラなので元の配列ndarrayの形状は維持されず、平坦化される。

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

欠損値np.nanを含む行を削除(除外)

欠損値np.nanを含む行を削除する場合、NumPy配列ndarrayに一つでもTrueがあるとTrueを返すany()メソッドを使う。

引数axis=1とすると、各行に対して一つでもTrueがあるかどうかを判定する。

print(np.isnan(arr).any(axis=1))
# [ True  True False]

否定演算子~を使って、一つもnp.nanがない行をTrueとする。

print(~np.isnan(arr).any(axis=1))
# [False False  True]

元のndarrayの行(1つ目の次元)に対してこのboolndarrayを適用することで、欠損値np.nanを含む行を削除することができる。

print(arr[~np.isnan(arr).any(axis=1), :])
# [[ 31.  32.  33.  34.]]

以下のように省略してもOK。

print(arr[~np.isnan(arr).any(axis=1)])
# [[ 31.  32.  33.  34.]]

欠損値np.nanを含む列を削除(除外)

欠損値np.nanを含む列を削除する場合も、行の場合と同じくany()メソッドを使う。

引数axis=0とすると、各列に対して一つでもTrueがあるかどうかを判定する。否定演算子~を使って、一つもnp.nanがない列をTrueとする。

print(~np.isnan(arr).any(axis=0))
# [ True False False  True]

元のndarrayの列(2つ目の次元)に対してこのboolndarrayを適用することで、欠損値np.nanを含む列を削除することができる。

print(arr[:, ~np.isnan(arr).any(axis=0)])
# [[ 11.  14.]
#  [ 21.  24.]
#  [ 31.  34.]]
スポンサーリンク
シェア
このエントリーをはてなブックマークに追加

関連カテゴリー

関連記事