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

NumPyの配列ndarrayの欠損値np.nanを含む行または列を削除(除外)する場合、np.isnan()で欠損値np.nanを判定し、any()を使ってnp.nanが含まれていない行・列を抽出します。 なお、欠損値np.nanを削除するのではなく他の値で置き換える場合は、以下の記事を参照。

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

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

sample_nan.csv

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()メソッドを使います。

numpy.ndarray.any — NumPy v1.13 Manual

引数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つ目の次元)に対してこのboolのndarrayを適用することで、欠損値np.nanを含む行を削除することができます。

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

以下のように省略しても問題ありません。

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つ目の次元)に対してこのboolのndarrayを適用することで、欠損値np.nanを含む列を削除することができます。

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

シェア

関連カテゴリー

Python NumPy

Python, NumPy(OpenCV)で画像を二値化処理 Python, OpenCV, NumPyで画像のアルファブレンドとマスク処理 『Python Data Science Handbook』(英語の無料オンライン版あり) NumPy配列ndarrayの条件を満たす要素数をカウント Pythonでメソッドチェーンを改行して書く NumPy配列ndarrayをバイナリファイル(npy, npz)で保存 pandas.DataFrame, SeriesとNumPy配列ndarrayを相互に変換 pandasからNumPyの関数などを使う方法(pd.np) NumPyで欠損値np.nanを含む配列ndarrayの合計や平均を算出 NumPyで条件に応じた処理を行うwhereの使い方 NumPy配列ndarrayに要素・行・列を挿入、追加するinsertの使い方 『Pythonデータサイエンスハンドブック』は良書(NumPy, pandasほか) NumPy配列ndarrayをシフト(スクロール)させるnp.roll NumPy配列ndarrayの最大値・最小値のインデックス(位置)を取得 NumPy配列ndarrayをタイル状に繰り返し並べるnp.tile

Last Updated: 6/26/2019, 10:34:03 PM