web-dev-qa-db-ja.com

リストPython / NumPyからNanを削除する方法

私は値を数えるリストを持っています、私が得た値の1つは「nan」です

countries= [nan, 'USA', 'UK', 'France']

削除しようとしましたが、毎回エラーが発生します

cleanedList = [x for x in countries if (math.isnan(x) == True)]
TypeError: a float is required

私がこれを試したとき:

cleanedList = cities[np.logical_not(np.isnan(countries))]
cleanedList = cities[~np.isnan(countries)]

TypeError: ufunc 'isnan' not supported for the input types, and the inputs could not be safely coerced to any supported types according to the casting rule ''safe''
57
user3001937

質問が変更されたため、答えがあります。

math.isnanを使用して文字列をテストすることはできません。これはfloat引数を想定しているためです。 countriesリストには、フロートと文字列があります。

あなたの場合、次のもので十分です:

cleanedList = [x for x in countries if str(x) != 'nan']

古い答え

countriesリストでは、リテラル'nan'はPython float nanではなく、次と同等の文字列です。

float('NaN')

あなたの場合、次のもので十分です:

cleanedList = [x for x in countries if x != 'nan']
82
user764357

問題は、np.isnan()が文字列値を正しく処理しないという事実に起因しています。たとえば、次の場合:

np.isnan("A")
TypeError: ufunc 'isnan' not supported for the input types, and the inputs could not be safely coerced to any supported types according to the casting rule ''safe''

ただし、pandasバージョンpd.isnull()は、数値および文字列値に対して機能します。

pd.isnull("A")
> False

pd.isnull(3)
> False

pd.isnull(np.nan)
> True

pd.isnull(None)
> True
12
Yohan Obadia
import numpy as np

mylist = [3, 4, 5, np.nan]
l = [x for x in mylist if ~np.isnan(x)]

これにより、すべてのNaNが削除されます。もちろん、ここでは文字列ではなく、実際のNaN(np.nan)であると想定しています。

10
Ajay Shah

例を使用して...

countries= [nan, 'USA', 'UK', 'France']

Nanはnan(nan!= nan)に等しくなく、countries [0] = nanであるため、次のことに注意する必要があります。

countries[0] == countries[0]
False

しかしながら、

countries[1] == countries[1]
True
countries[2] == countries[2]
True
countries[3] == countries[3]
True

したがって、以下が機能するはずです。

cleanedList = [x for x in countries if x == x]
5
vlmercado

numpy fancy indexing を使用してください:

In [29]: countries=np.asarray(countries)

In [30]: countries[countries!='nan']
Out[30]: 
array(['USA', 'UK', 'France'], 
      dtype='|S6')
5
zhangxaochen

要素タイプを確認する場合

type(countries[1])

結果は<class float>になるため、次のコードを使用できます。

[i for i in countries if type(i) is not float]
2
Beyran11

あなたの例では'nan'は文字列なので、isnan()を使用する代わりに文字列をチェックするだけです

このような:

cleanedList = [x for x in countries if x != 'nan']
1
Serial