配列から nan 値を削除する方法を知りたいです。私の配列は次のようになります。
x = [1400, 1500, 1600, nan, nan, nan ,1700] #Not in this exact configuration
nan
から値を削除するにはどうすればよいx
ですか?
配列にnumpyを使用している場合は、使用することもできます
x = x[numpy.logical_not(numpy.isnan(x))]
同等に
x = x[~numpy.isnan(x)]
[省略形を追加してくれた chbrown に感謝]
説明
内部関数は、数値ではないすべての場所numpy.isnan
に値を持つブール/論理配列を返します。反対のことが必要なので、論理否定演算子を使用して、有効な数値であるすべての場所に sを持つ配列を取得します。True
x
~
True
x
最後に、この論理配列を使用して元の配列にインデックスを付け、x
NaN 以外の値だけを取得します。
filter(lambda v: v==v, x)
v!=v は NaN のみであるため、リストと numpy 配列の両方で機能します
これを試して:
import math
print [value for value in x if not math.isnan(value)]
詳細については、List Comprehensionsを参照してください。
上記を行う:
x = x[~numpy.isnan(x)]
また
x = x[numpy.logical_not(numpy.isnan(x))]
同じ変数 (x) にリセットしても実際の nan 値は削除されず、別の変数を使用する必要があることがわかりました。別の変数に設定すると、ナンが削除されました。例えば
y = x[~numpy.isnan(x)]
使用している場合numpy
# first get the indices where the values are finite
ii = np.isfinite(x)
# second get the values
x = x[ii]
受け入れられた答えは、2次元配列の形を変えます。Pandas dropna()機能を使用して、ここで解決策を提示します。1D および 2D 配列で機能します。2D の場合、weather を選択して、を含む行または列をドロップnp.nan
できます。
import pandas as pd
import numpy as np
def dropna(arr, *args, **kwarg):
assert isinstance(arr, np.ndarray)
dropped=pd.DataFrame(arr).dropna(*args, **kwarg).values
if arr.ndim==1:
dropped=dropped.flatten()
return dropped
x = np.array([1400, 1500, 1600, np.nan, np.nan, np.nan ,1700])
y = np.array([[1400, 1500, 1600], [np.nan, 0, np.nan] ,[1700,1800,np.nan]] )
print('='*20+' 1D Case: ' +'='*20+'\nInput:\n',x,sep='')
print('\ndropna:\n',dropna(x),sep='')
print('\n\n'+'='*20+' 2D Case: ' +'='*20+'\nInput:\n',y,sep='')
print('\ndropna (rows):\n',dropna(y),sep='')
print('\ndropna (columns):\n',dropna(y,axis=1),sep='')
print('\n\n'+'='*20+' x[np.logical_not(np.isnan(x))] for 2D: ' +'='*20+'\nInput:\n',y,sep='')
print('\ndropna:\n',x[np.logical_not(np.isnan(x))],sep='')
結果:
==================== 1D Case: ====================
Input:
[1400. 1500. 1600. nan nan nan 1700.]
dropna:
[1400. 1500. 1600. 1700.]
==================== 2D Case: ====================
Input:
[[1400. 1500. 1600.]
[ nan 0. nan]
[1700. 1800. nan]]
dropna (rows):
[[1400. 1500. 1600.]]
dropna (columns):
[[1500.]
[ 0.]
[1800.]]
==================== x[np.logical_not(np.isnan(x))] for 2D: ====================
Input:
[[1400. 1500. 1600.]
[ nan 0. nan]
[1700. 1800. nan]]
dropna:
[1400. 1500. 1600. 1700.]