У меня есть список, который содержит значения, одно из полученных мной значений - 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''
"nan"
, а не на фактическое значение NaN.if condition == True
не нужно, всегда можно просто сделатьif condition
.np.isnan('USA')
будет отправлено такое же сообщение об ошибке. Если найду какое-то решение, выложу.Ответы:
Вопрос изменился, поэтому есть ответ:
Строки не могут быть протестированы с использованием,
math.isnan
поскольку ожидается аргумент с плавающей запятой. В вашем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']
источник
math.isnan
, естественно, будут содержать ошибки.x
в строку, чтобы вы могли ее сравнить.nan
всегда возвращает false для==
, даже если сравнивать с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), а country [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
).источник
x[~ np.isnan(x)]
:? В numpy не требуется понимание списка. Конечно, я предполагаю, что x - массив numpy.использовать 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]
источник
Мне нравится удалять недостающие значения из такого списка:
list_no_nan = [x for x in list_with_nan if pd.notnull(x)]
источник
В вашем примере
'nan'
это строка, поэтому вместо использованияisnan()
просто проверьте строкукак это:
cleanedList = [x for x in countries if x != 'nan']
источник
Другой способ сделать это - использовать такой фильтр :
countries = list(filter(lambda x: str(x) != 'nan', countries))
источник
Я заметил, что 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)
источник