Подтвердить что ты не робот

Как удалить Nan из списка Python/NumPy

У меня есть список, который имеет значения countain, одно из значений, которое я получил, это "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''
4b9b3361

Ответ 1

Вопрос изменился, так что есть ответ:

Строки не могут быть протестированы с помощью math.isnan, так как это ожидает аргумент float. В вашем списке countries у вас есть поплавки и строки.

В вашем случае должно быть достаточно:

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

Старый ответ

В вашем списке countries литерал 'nan' представляет собой строку, а не плавающий Python nan, который эквивалентен:

float('NaN')

В вашем случае должно быть достаточно:

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

Ответ 2

Проблема заключается в том, что 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''

Однако версия pd.isnull() для панд работает с числовыми и строковыми значениями:

pd.isnull("A")
> False

pd.isnull(3)
> False

pd.isnull(np.nan)
> True

pd.isnull(None)
> True

Ответ 3

import numpy as np

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

Это должно удалить все NaN. Конечно, я предполагаю, что здесь не строка, а фактический NaN (np.nan).

Ответ 5

Используя ваш пример, где...

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

Так как nan не равен nan (nan! = Nan) и стран [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]

Ответ 6

если вы проверите для типа элемента

type(countries[1])

результат будет <class float> поэтому вы можете использовать следующий код:

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

Ответ 7

В вашем примере 'nan' - это строка, поэтому вместо использования isnan() просто проверьте строку

вот так:

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

Ответ 8

Я заметил, что Pandas, например, вернет 'nan' для пустых значений. Поскольку это не строка, вам нужно преобразовать ее в одну, чтобы соответствовать ей. Например:

ulist = df.column1.unique() #create a list from a column with Pandas which 
for loc in ulist:
    loc = str(loc)   #here 'nan' is converted to a string to compare with if
    if loc != 'nan':
        print(loc)