J'ai une liste qui compte des valeurs, l'une des valeurs que j'ai est 'nan'
countries= [nan, 'USA', 'UK', 'France']
J'ai essayé de le supprimer, mais j'obtiens à chaque fois une erreur
cleanedList = [x for x in countries if (math.isnan(x) == True)]
TypeError: a float is required
Quand j'ai essayé celui-ci:
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"
, pas à une valeur NaN réelle.if condition == True
est inutile, vous pouvez toujours le faireif condition
.np.isnan('USA')
enverra le même message d'erreur. Si je trouve une solution, je la téléchargerai.Réponses:
La question a changé, donc la réponse:
Les chaînes ne peuvent pas être testées en utilisant
math.isnan
car cela attend un argument float. Dans votrecountries
liste, vous avez des flotteurs et des chaînes.Dans votre cas, ce qui suit devrait suffire:
cleanedList = [x for x in countries if str(x) != 'nan']
Ancienne réponse
Dans votre
countries
liste, le littéral'nan'
est une chaîne et non le flottant Pythonnan
qui équivaut à:float('NaN')
Dans votre cas, ce qui suit devrait suffire:
cleanedList = [x for x in countries if x != 'nan']
la source
math.isnan
produiront naturellement par des erreurs.x
en une chaîne pour que vous puissiez la comparer.nan
renvoie toujours false pour==
, même par rapport ànan
, c'est donc le moyen le plus simple de le comparer.Le problème vient du fait que
np.isnan()
ne gère pas correctement les valeurs de chaîne. Par exemple, si vous faites: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''
Cependant, la version pandas
pd.isnull()
fonctionne pour les valeurs numériques et de chaîne:pd.isnull("A") > False pd.isnull(3) > False pd.isnull(np.nan) > True pd.isnull(None) > True
la source
En utilisant votre exemple où ...
countries= [nan, 'USA', 'UK', 'France']
Étant donné que nan n'est pas égal à nan (nan! = Nan) et pays [0] = nan, vous devez observer les éléments suivants:
countries[0] == countries[0] False
cependant,
countries[1] == countries[1] True countries[2] == countries[2] True countries[3] == countries[3] True
Par conséquent, les éléments suivants devraient fonctionner:
cleanedList = [x for x in countries if x == x]
la source
import numpy as np mylist = [3, 4, 5, np.nan] l = [x for x in mylist if ~np.isnan(x)]
Cela devrait supprimer tout NaN. Bien sûr, je suppose que ce n'est pas une chaîne ici mais du NaN (
np.nan
).la source
x[~ np.isnan(x)]
:? Aucune compréhension de liste nécessaire dans numpy. Bien sûr, je suppose que x est un tableau numpy.utilisez l' indexation fantaisie numpy :
In [29]: countries=np.asarray(countries) In [30]: countries[countries!='nan'] Out[30]: array(['USA', 'UK', 'France'], dtype='|S6')
la source
si vous vérifiez le type d'élément
type(countries[1])
le résultat sera
<class float>
que vous pouvez utiliser le code suivant:[i for i in countries if type(i) is not float]
la source
J'aime supprimer les valeurs manquantes d'une liste comme celle-ci:
list_no_nan = [x for x in list_with_nan if pd.notnull(x)]
la source
Dans votre exemple, il
'nan'
y a une chaîne, donc au lieu d'utiliser,isnan()
vérifiez simplement la chaînecomme ça:
cleanedList = [x for x in countries if x != 'nan']
la source
Une autre façon de le faire consisterait à utiliser un filtre comme celui-ci:
countries = list(filter(lambda x: str(x) != 'nan', countries))
la source
J'ai remarqué que Pandas, par exemple, renverra «nan» pour les valeurs vides. Comme ce n'est pas une chaîne, vous devez la convertir en une chaîne pour la faire correspondre. Par exemple:
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)
la source