Tengo una lista que cuenta valores, uno de los valores que obtuve es 'nan'
countries= [nan, 'USA', 'UK', 'France']
Traté de eliminarlo, pero cada vez aparece un error
cleanedList = [x for x in countries if (math.isnan(x) == True)]
TypeError: a float is required
Cuando probé 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"
, no un valor real de NaN.if condition == True
es innecesario, siempre puedes hacerloif condition
.np.isnan('USA')
le enviará el mismo mensaje de error. Si encuentro alguna solución, la subiré.Respuestas:
La pregunta ha cambiado, por lo que tiene la respuesta:
Las cadenas no se pueden probar usando
math.isnan
ya que esto espera un argumento flotante. En sucountries
lista, tiene flotadores y cuerdas.En su caso, lo siguiente debería ser suficiente:
cleanedList = [x for x in countries if str(x) != 'nan']
Respuesta antigua
En su
countries
lista, el literal'nan'
es una cadena, no el flotante de Python,nan
que es equivalente a:float('NaN')
En su caso, lo siguiente debería ser suficiente:
cleanedList = [x for x in countries if x != 'nan']
fuente
math.isnan
se corregirán naturalmente con los errores.x
en una cadena para que puedas compararlo.nan
siempre devuelve falso para==
, incluso cuando se compara connan
, por lo que esa es la forma más fácil de compararlo.El problema proviene del hecho de que
np.isnan()
no maneja correctamente los valores de cadena. Por ejemplo, si lo hace: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''
Sin embargo, la versión de pandas
pd.isnull()
funciona para valores numéricos y de cadena:pd.isnull("A") > False pd.isnull(3) > False pd.isnull(np.nan) > True pd.isnull(None) > True
fuente
Usando su ejemplo donde ...
countries= [nan, 'USA', 'UK', 'France']
Dado que nan no es igual a nan (nan! = Nan) y los países [0] = nan, debes observar lo siguiente:
countries[0] == countries[0] False
Sin embargo,
countries[1] == countries[1] True countries[2] == countries[2] True countries[3] == countries[3] True
Por lo tanto, lo siguiente debería funcionar:
cleanedList = [x for x in countries if x == x]
fuente
import numpy as np mylist = [3, 4, 5, np.nan] l = [x for x in mylist if ~np.isnan(x)]
Esto debería eliminar todo el NaN. Por supuesto, supongo que no es una cadena aquí, sino un NaN (
np.nan
) real .fuente
x[~ np.isnan(x)]
:? No se necesita comprensión de listas en numpy. Por supuesto, supongo que x es una matriz numerosa.use la indexación de lujo numpy :
In [29]: countries=np.asarray(countries) In [30]: countries[countries!='nan'] Out[30]: array(['USA', 'UK', 'France'], dtype='|S6')
fuente
si comprueba el tipo de elemento
type(countries[1])
el resultado será
<class float>
que puedas usar el siguiente código:[i for i in countries if type(i) is not float]
fuente
Me gusta eliminar los valores faltantes de una lista como esta:
list_no_nan = [x for x in list_with_nan if pd.notnull(x)]
fuente
En su ejemplo,
'nan'
es una cadena, así que en lugar de usarisnan()
solo verifique la cadenaMe gusta esto:
cleanedList = [x for x in countries if x != 'nan']
fuente
Otra forma de hacerlo incluiría usar un filtro como este:
countries = list(filter(lambda x: str(x) != 'nan', countries))
fuente
Noté que Pandas, por ejemplo, devolverá 'nan' para valores en blanco. Como no es una cadena, debe convertirla en una para que coincida. Por ejemplo:
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)
fuente