Eu tenho uma lista que contém valores, um dos valores que recebi é 'nan'
countries= [nan, 'USA', 'UK', 'France']
Eu tentei removê-lo, mas sempre recebo um erro
cleanedList = [x for x in countries if (math.isnan(x) == True)]
TypeError: a float is required
Quando eu tentei este:
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"
, não com um valor NaN real.if condition == True
é desnecessário, você sempre pode apenas fazerif condition
.np.isnan('USA')
enviaremos a mesma mensagem de erro. Se eu encontrar alguma solução, irei fazer o upload.Respostas:
A pergunta mudou, então a tem a resposta:
Strings não podem ser testados usando,
math.isnan
pois isso espera um argumento float. Em suacountries
lista, você tem flutuadores e strings.No seu caso, o seguinte deve ser suficiente:
cleanedList = [x for x in countries if str(x) != 'nan']
Resposta antiga
Na tua
countries
lista, o literal'nan'
é uma string, não o flutuante Python,nan
que é equivalente a:float('NaN')
No seu caso, o seguinte deve ser suficiente:
cleanedList = [x for x in countries if x != 'nan']
fonte
math.isnan
irão naturalizar através de erros com.x
em uma string para que você possa compará-la.nan
sempre retorna falso para==
, mesmo quando comparado comnan
, então essa é a maneira mais fácil de comparar.O problema vem do fato de que
np.isnan()
não trata os valores das strings corretamente. Por exemplo, se você: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''
No entanto, a versão do pandas
pd.isnull()
funciona para valores numéricos e de string:pd.isnull("A") > False pd.isnull(3) > False pd.isnull(np.nan) > True pd.isnull(None) > True
fonte
Usando seu exemplo onde ...
countries= [nan, 'USA', 'UK', 'France']
Como nan não é igual a nan (nan! = Nan) e países [0] = nan, você deve observar o seguinte:
countries[0] == countries[0] False
Contudo,
countries[1] == countries[1] True countries[2] == countries[2] True countries[3] == countries[3] True
Portanto, o seguinte deve funcionar:
cleanedList = [x for x in countries if x == x]
fonte
import numpy as np mylist = [3, 4, 5, np.nan] l = [x for x in mylist if ~np.isnan(x)]
Isso deve remover todo o NaN. Claro, presumo que não seja uma string aqui, mas sim um NaN (
np.nan
) real .fonte
x[~ np.isnan(x)]
:? Nenhuma compreensão de lista necessária em entorpecido. Claro, suponho que x é uma matriz numpy.Eu gosto de remover valores ausentes de uma lista como esta:
list_no_nan = [x for x in list_with_nan if pd.notnull(x)]
fonte
se você verificar o tipo de elemento
type(countries[1])
o resultado será
<class float>
para que você possa usar o seguinte código:[i for i in countries if type(i) is not float]
fonte
use indexação fantasia numpy :
In [29]: countries=np.asarray(countries) In [30]: countries[countries!='nan'] Out[30]: array(['USA', 'UK', 'France'], dtype='|S6')
fonte
Outra maneira de fazer isso incluiria o uso de filtros como este:
countries = list(filter(lambda x: str(x) != 'nan', countries))
fonte
No seu exemplo
'nan'
está uma string, então, em vez deisnan()
apenas verifique a stringcomo isso:
cleanedList = [x for x in countries if x != 'nan']
fonte
Percebi que o Pandas, por exemplo, retornará 'nan' para valores em branco. Uma vez que não é uma string, você precisa convertê-la em um para combiná-la. Por exemplo:
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)
fonte