私は値を数えるリストを持っています、私が得た値の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''
質問が変更されたため、答えがあります。
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']
問題は、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
import numpy as np
mylist = [3, 4, 5, np.nan]
l = [x for x in mylist if ~np.isnan(x)]
これにより、すべてのNaNが削除されます。もちろん、ここでは文字列ではなく、実際のNaN(np.nan
)であると想定しています。
例を使用して...
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]
numpy fancy indexing を使用してください:
In [29]: countries=np.asarray(countries)
In [30]: countries[countries!='nan']
Out[30]:
array(['USA', 'UK', 'France'],
dtype='|S6')
要素タイプを確認する場合
type(countries[1])
結果は<class float>
になるため、次のコードを使用できます。
[i for i in countries if type(i) is not float]
あなたの例では'nan'
は文字列なので、isnan()
を使用する代わりに文字列をチェックするだけです
このような:
cleanedList = [x for x in countries if x != 'nan']