[python] 목록 Python / NumPy에서 Nan을 제거하려면 어떻게해야합니까?

값을 계산하는 목록이 있는데, 내가 얻은 값 중 하나는 ‘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.isnanfloat 인수를 예상 하므로 문자열을 사용하여 테스트 할 수 없습니다 . 당신에 countries목록, 당신은 수레와 문자열을 가지고있다.

귀하의 경우 다음 사항으로 충분합니다.

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

이전 답변

당신에 countries목록, 리터럴은 'nan'문자열이 아닌 파이썬 부동입니다 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


답변

귀하의 예를 사용하여 …

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]


답변

import numpy as np

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

모든 NaN을 제거해야합니다. 물론 여기에서는 문자열이 아니라 실제 NaN ( np.nan) 이라고 가정합니다 .


답변

numpy 멋진 인덱싱을 사용하십시오 .

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]


답변

다음과 같이 목록에서 누락 된 값을 제거하고 싶습니다.

list_no_nan = [x for x in list_with_nan if pd.notnull(x)]