Ich habe eine Liste mit Countain-Werten. Einer der Werte, die ich erhalten habe, ist 'nan'.
countries= [nan, 'USA', 'UK', 'France']
Ich habe versucht, es zu entfernen, aber ich erhalte jedes Mal eine Fehlermeldung
cleanedList = [x for x in countries if (math.isnan(x) == True)]
TypeError: a float is required
Als ich es versuchte:
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"
, kein tatsächlicher NaN-Wert.if condition == True
ist unnötig, kann man immer einfach machenif condition
.np.isnan('USA')
die gleiche Fehlermeldung gesendet. Wenn ich eine Lösung finde, werde ich sie hochladen.Antworten:
Die Frage hat sich geändert, ebenso die Antwort:
Strings können nicht mit getestet werden,
math.isnan
da dies ein float-Argument erwartet. In Ihrercountries
Liste haben Sie Floats und Strings.In Ihrem Fall sollte Folgendes ausreichen:
cleanedList = [x for x in countries if str(x) != 'nan']
Alte Antwort
In Ihrer
countries
Liste ist das Literal'nan'
eine Zeichenfolge, nicht das Python-Float. Diesnan
entspricht:float('NaN')
In Ihrem Fall sollte Folgendes ausreichen:
cleanedList = [x for x in countries if x != 'nan']
quelle
math.isnan
natürlich Fehler auftreten.x
in einen String, damit Sie ihn vergleichen können.nan
Gibt immer false für zurück==
, auch im Vergleich zunan
. Dies ist der einfachste Weg, dies zu vergleichen.Das Problem ergibt sich aus der Tatsache, dass
np.isnan()
Zeichenfolgenwerte nicht korrekt behandelt werden. Wenn Sie zum Beispiel Folgendes tun: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''
Die Pandas-Version
pd.isnull()
funktioniert jedoch für numerische Werte und Zeichenfolgenwerte:pd.isnull("A") > False pd.isnull(3) > False pd.isnull(np.nan) > True pd.isnull(None) > True
quelle
Verwenden Sie Ihr Beispiel, wo ...
countries= [nan, 'USA', 'UK', 'France']
Da nan nicht gleich nan (nan! = Nan) und Ländern [0] = nan ist, sollten Sie Folgendes beachten:
countries[0] == countries[0] False
Jedoch,
countries[1] == countries[1] True countries[2] == countries[2] True countries[3] == countries[3] True
Daher sollte Folgendes funktionieren:
cleanedList = [x for x in countries if x == x]
quelle
import numpy as np mylist = [3, 4, 5, np.nan] l = [x for x in mylist if ~np.isnan(x)]
Dies sollte alles NaN entfernen. Natürlich gehe ich davon aus, dass es sich hier nicht um einen String handelt, sondern um tatsächliches NaN (
np.nan
).quelle
x[~ np.isnan(x)]
? In numpy ist kein Listenverständnis erforderlich. Natürlich gehe ich davon aus, dass x ein Numpy-Array ist.Verwenden Sie numpy Fancy Indexing :
In [29]: countries=np.asarray(countries) In [30]: countries[countries!='nan'] Out[30]: array(['USA', 'UK', 'France'], dtype='|S6')
quelle
wenn Sie nach dem Elementtyp suchen
type(countries[1])
Das Ergebnis ist,
<class float>
dass Sie den folgenden Code verwenden können:[i for i in countries if type(i) is not float]
quelle
Ich möchte fehlende Werte aus einer Liste wie dieser entfernen:
list_no_nan = [x for x in list_with_nan if pd.notnull(x)]
quelle
In Ihrem Beispiel
'nan'
ist eine Zeichenkette , so dass anstelle der Verwendungisnan()
nur für die Zeichenfolge überprüfenso was:
cleanedList = [x for x in countries if x != 'nan']
quelle
Eine andere Möglichkeit wäre die Verwendung eines Filters wie folgt:
countries = list(filter(lambda x: str(x) != 'nan', countries))
quelle
Mir ist aufgefallen, dass Pandas zum Beispiel für leere Werte 'nan' zurückgeben. Da es sich nicht um eine Zeichenfolge handelt, müssen Sie sie in eine konvertieren, um sie abzugleichen. Zum Beispiel:
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)
quelle