Mam listę zawierającą wartości, jedna z wartości, które otrzymałem, to „nan”
countries= [nan, 'USA', 'UK', 'France']
Próbowałem go usunąć, ale za każdym razem pojawia się błąd
cleanedList = [x for x in countries if (math.isnan(x) == True)]
TypeError: a float is required
Kiedy próbowałem tego:
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"
, a nie rzeczywista wartość NaN.if condition == True
jest niepotrzebne, zawsze możesz to zrobićif condition
.np.isnan('USA')
wyśle ten sam komunikat o błędzie. Jeśli znajdę jakieś rozwiązanie, wrzucę je.Odpowiedzi:
Pytanie się zmieniło, więc odpowiedź:
Ciągów nie można testować przy użyciu,
math.isnan
ponieważ wymaga to argumentu zmiennoprzecinkowego. Na swojejcountries
liście masz liczby zmiennoprzecinkowe i łańcuchy.W Twoim przypadku powinny wystarczyć:
cleanedList = [x for x in countries if str(x) != 'nan']
Stara odpowiedź
Na twojej
countries
liście literał'nan'
to łańcuch, a nie liczba zmiennoprzecinkowa w Pythonie,nan
która jest równoważna z:float('NaN')
W Twoim przypadku powinny wystarczyć:
cleanedList = [x for x in countries if x != 'nan']
źródło
math.isnan
naturalnie przejdą przez błędy.x
na ciąg, więc możesz to porównać.nan
zawsze zwraca wartość false dla==
, nawet w porównaniu znan
, więc jest to najłatwiejszy sposób porównania.Problem wynika z tego, że
np.isnan()
nie obsługuje poprawnie wartości łańcuchowych. Na przykład, jeśli: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''
Jednak wersja pandy
pd.isnull()
działa dla wartości liczbowych i ciągów:pd.isnull("A") > False pd.isnull(3) > False pd.isnull(np.nan) > True pd.isnull(None) > True
źródło
Na przykładzie, w którym ...
countries= [nan, 'USA', 'UK', 'France']
Ponieważ nan nie jest równe nan (nan! = Nan), a kraje [0] = nan, należy przestrzegać następujących zasad:
countries[0] == countries[0] False
Jednak,
countries[1] == countries[1] True countries[2] == countries[2] True countries[3] == countries[3] True
Dlatego powinno działać:
cleanedList = [x for x in countries if x == x]
źródło
import numpy as np mylist = [3, 4, 5, np.nan] l = [x for x in mylist if ~np.isnan(x)]
Powinno to usunąć wszystkie NaN. Oczywiście zakładam, że nie jest to tutaj ciąg znaków, ale rzeczywisty NaN (
np.nan
).źródło
x[~ np.isnan(x)]
:? W numpy nie jest potrzebne rozumienie listy. Oczywiście zakładam, że x jest tablicą numpy.użyj numpy fantazyjnego indeksowania :
In [29]: countries=np.asarray(countries) In [30]: countries[countries!='nan'] Out[30]: array(['USA', 'UK', 'France'], dtype='|S6')
źródło
jeśli sprawdzisz typ elementu
type(countries[1])
wynik będzie
<class float>
taki, że możesz użyć następującego kodu:[i for i in countries if type(i) is not float]
źródło
Lubię usuwać brakujące wartości z takiej listy:
list_no_nan = [x for x in list_with_nan if pd.notnull(x)]
źródło
W twoim przykładzie
'nan'
jest to ciąg, więc zamiast używaćisnan()
po prostu sprawdź ciąglubię to:
cleanedList = [x for x in countries if x != 'nan']
źródło
Innym sposobem na zrobienie tego byłoby użycie takiego filtra :
countries = list(filter(lambda x: str(x) != 'nan', countries))
źródło
Zauważyłem, że na przykład Pandy zwracają „nan” dla pustych wartości. Ponieważ nie jest to ciąg, musisz go przekonwertować na jeden, aby go dopasować. Na przykład:
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)
źródło