2017-02-22 9 views
1

numpy配列からnanを削除します。パンダからnumpyに変換した後に配列がnanを含んでいる場合は 'nan'を削除するかnumpyの長さを減らす

np_array = ["123","pqr","123",nan,"avb", nan] 

予想される出力:

["123","pqr","123","avb"] 

我々はpandas.dropna()を使ってパンダでそれを行う場合、それは私が行うにはしたくない行全体を削除し、私のnumpyの配列が含まれていると言うことができます。私は値を削除し、配列のサイズを小さくしたいだけです。

可能な方法はありますか?

+1

これらの提案された複製は、数値配列に対してのみ機能します(これらは実際には重複しません)! – MSeifert

+0

あなたはどちらかの行を削除したくないと思っていますか? – AsheKetchum

+0

pandas.fillna()を見ましたか?一般的に、行が観測と見なされる場合、行全体を節約しようとし、行内の値を消去するだけでなく、 – AsheKetchum

答えて

0

isnan()トリックを行う必要があります。それを行う方法については、最小限の例をワーキング:

>>> import numpy as np 
>>> np_array = np.array([1,2,3,np.nan,4]) 
>>> np_array 
array([ 1., 2., 3., nan, 4.]) 
>>> np_array = np_array[~np.isnan(np_array)] 
>>> np_array 
array([ 1., 2., 3., 4.]) 
+0

が動作しません: エラー:*** TypeError:ufunc 'isnan'は入力タイプと入力に対応していません。 ティンキングルール '' safe '' dtypeはオブジェクト –

+0

配列の 'dtype'を確認してください。 'isnan'はオブジェクト配列のエラーを発生させます。オブジェクト配列を持つ理由がない場合は、 'arr.dtype = np.float64'か何でもできます。それで' isnan'が動作します。オブジェクトが必要な場合は、上記のMSeifertの答えを使用してください。 –

0

は試してみてください。この

np_clean = [x for x in np_array if str(x) != 'nan'] 

それはあなたのリストからナンを削除します

1

NaN sが内の文字列があるので、あなたはnp.isnanを使用することはできませんあなた文字列と比較してブール型インデックスを使用することができます。"nan"

>>> import numpy as np 
>>> np_array = np.array(["123","pqr","123",np.nan,"avb", np.nan]) 
>>> np_array[np_array != 'nan'] 
array(['1234', 'pqr', '123', 'avb'], 
     dtype='<U4') 
0

これは数値配列に対して機能します。

filter(lambda x: np.isfinite(x), np.array([1,2,3,np.nan])) 

>>>[1.0, 2.0, 3.0] 
関連する問題