note.nkmk.me

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

Date: 2018-01-30 / Modified: 2019-10-28 / tags: Python, NumPy

NumPyの配列ndarrayの欠損値NaNを含む行または列を削除(除外)する場合、np.isnan()で欠損値を判定し、any()all()を使って欠損値が含まれていない行・列を抽出する。

ここでは以下の内容について説明する。

  • 欠損値NaNをすべて削除(除外)
  • 欠損値NaNを含む行を削除(除外)
  • 欠損値NaNを含む列を削除(除外)

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

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

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

import numpy as np

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

欠損値NaNをすべて削除(除外)

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

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

このndarrayに否定演算子~を使って欠損値NaNの位置をFalseとすることで欠損値を削除(欠損値ではない要素を抽出)することができるが、残る要素の個数がバラバラなので元の配列ndarrayの形状は維持されず、平坦化(一次元化)される。

print(~np.isnan(a))
# [[ True  True False  True]
#  [ True False False  True]
#  [ True  True  True  True]]

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

欠損値NaNを含む行を削除(除外)

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

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

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

否定演算子~を使って、欠損値が一つもない行をTrueとする。

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

元のndarrayの行(一つ目の次元)に対してこのboolndarrayを適用することで、欠損値を含む行を削除(欠損値を含まない行を抽出)することができる。

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

以下のように列の指定を省略してもOK。

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

すべての要素が欠損値である行のみを削除したい場合はany()ではなくall()を使えばよい。

all()を使った例は次で示す。

欠損値NaNを含む列を削除(除外)

欠損値NaNを含む列を削除する場合も同様。

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

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

元のndarrayの列(二つ目の次元)に対してこのboolndarrayを適用することで、欠損値を含む列を削除(欠損値を含まない列を抽出)することができる。

print(a[:, ~np.isnan(a).any(axis=0)])
# [[11. 14.]
#  [21. 24.]
#  [31. 34.]]

すべての要素が欠損値である列のみを削除したい場合はany()ではなくall()を使えばよい。

a = np.genfromtxt('data/src/sample_nan.csv', delimiter=',')
a[2, 2] = np.nan
print(a)
# [[11. 12. nan 14.]
#  [21. nan nan 24.]
#  [31. 32. nan 34.]]

print(a[:, ~np.isnan(a).any(axis=0)])
# [[11. 14.]
#  [21. 24.]
#  [31. 34.]]

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

関連カテゴリー

関連記事