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 == Truees 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.isnanya que esto espera un argumento flotante. En sucountrieslista, 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
countrieslista, el literal'nan'es una cadena, no el flotante de Python,nanque 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.isnanse corregirán naturalmente con los errores.xen una cadena para que puedas compararlo.nansiempre 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) > Truefuente
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] FalseSin embargo,
countries[1] == countries[1] True countries[2] == countries[2] True countries[3] == countries[3] TruePor 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