2014-01-09 3 views
29

У меня есть список, который countain значения, одно из значений, которые я получил это «нан»Как я могу удалить Nan из списка Python/NumPy

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'' 
+3

Это выглядит как строка '«нан»', а не фактическое значение NaN. – BrenBarn

+0

Да, это строка. * [x для x в странах, если x! = 'nan'] * – MarshalSHI

+3

'if condition == True' не нужно, вы всегда можете просто выполнить' if condition'. – reem

ответ

42

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

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

В вашем случае следующее должно хватить:

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

Старый ответ

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

float('NaN') 

В вашем случае foll в силу должно хватить:

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

Логично, что вы говорите правду. Но это не сработало со мной. – user3001937

+0

Тогда проблема в другой области, массив, который вы дали, - это строки, которые 'math.isnan' будут naturall через ошибки с. –

+0

Да!когда я печатаю вывод, я получил это: [nan, 'USA', 'UK', 'France'] – user3001937

1

В вашем примере 'nan' является строкой, так вместо того, чтобы использовать isnan() просто проверить строку

так:

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

использование NumPy fancy indexing:

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

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

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

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) 
5

Проблема возникает из-за того, что 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 
Смежные вопросы