Hoe kan ik Nan van de lijst Python/NumPy verwijderen

Ik heb een lijst met waarden, een van de waarden die ik heb is ‘nan’

countries= [nan, 'USA', 'UK', 'France']

Ik heb geprobeerd het te verwijderen, maar ik krijg elke keer een foutmelding

cleanedList = [x for x in countries if (math.isnan(x) == True)]
TypeError: a float is required

Toen ik deze probeerde:

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''

Antwoord 1, autoriteit 100%

De vraag is veranderd, dus ook het antwoord:

Strings kunnen niet worden getest met math.isnanomdat dit een float-argument verwacht. In je countrieslijst heb je floats en strings.

In jouw geval zou het volgende moeten volstaan:

cleanedList = [x for x in countries if str(x) != 'nan']

Oud antwoord

In uw countrieslijst is de letterlijke 'nan'een string, niet de Python float nandie gelijk is aan:

float('NaN')

In jouw geval zou het volgende moeten volstaan:

cleanedList = [x for x in countries if x != 'nan']

Antwoord 2, autoriteit 21%

Uw voorbeeld gebruikend waar…

countries= [nan, 'USA', 'UK', 'France']

Aangezien nan niet gelijk is aan nan (nan != nan) en landen[0] = nan, moet u het volgende in acht nemen:

countries[0] == countries[0]
False

Echter,

countries[1] == countries[1]
True
countries[2] == countries[2]
True
countries[3] == countries[3]
True

Daarom zou het volgende moeten werken:

cleanedList = [x for x in countries if x == x]

Antwoord 3, autoriteit 13%

Het probleem komt voort uit het feit dat np.isnan()stringwaarden niet correct verwerkt. Als u bijvoorbeeld het volgende doet:

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''

De panda-versie pd.isnull()werkt echter voor numerieke en tekenreekswaarden:

pd.isnull("A")
> False
pd.isnull(3)
> False
pd.isnull(np.nan)
> True
pd.isnull(None)
> True

Antwoord 4, autoriteit 10%

import numpy as np
mylist = [3, 4, 5, np.nan]
l = [x for x in mylist if ~np.isnan(x)]

Dit zou alle NaN moeten verwijderen. Ik neem natuurlijk aan dat het hier geen string is, maar echt NaN (np.nan).


Antwoord 5, autoriteit 6%

Ik verwijder graag ontbrekende waarden uit een lijst als deze:

list_no_nan = [x for x in list_with_nan if pd.notnull(x)]

Antwoord 6, autoriteit 5%

gebruik numpy fancy-indexering:

In [29]: countries=np.asarray(countries)
In [30]: countries[countries!='nan']
Out[30]: 
array(['USA', 'UK', 'France'], 
      dtype='|S6')

Antwoord 7, autoriteit 4%

als u controleert op het elementtype

type(countries[1])

het resultaat is <class float>
dus je kunt de volgende code gebruiken:

[i for i in countries if type(i) is not float]

Antwoord 8, autoriteit 2%

Een andere manier om dit te doen is het gebruik van filterals volgt:

countries = list(filter(lambda x: str(x) != 'nan', countries))

Antwoord 9

Een manier om de nan-waarde direct te verwijderen is:

import numpy as np    
countries.remove(np.nan)

Antwoord 10

In uw voorbeeld is 'nan'een tekenreeks, dus in plaats van isnan()te gebruiken, controleert u gewoon op de tekenreeks

zoals dit:

cleanedList = [x for x in countries if x != 'nan']

Antwoord 11

0 uitsluiten van de bereiklijst

['ret'+str(x) for x in list(range(-120,241,5)) if (x!=0) ]

Antwoord 12

Naar mijn mening hebben de meeste oplossingen voorgesteld geen rekening te houden met de prestaties. Loop voor en lijst Begrip zijn geen geldige oplossingen als uw lijst veel waarden heeft.
De onderstaande oplossing is efficiënter in termen van computationele tijd en het neemt niet aan dat uw lijst nummers of snaren heeft.

import numpy as np
import pandas as pd
list_var = [np.nan, 4, np.nan, 20,3, 'test']
df = pd.DataFrame({'list_values':list_var})
list_var2 = list(df['list_values'].dropna())
print("\n* list_var2 = {}".format(list_var2))

Antwoord 13

Ik heb gemerkt dat Panda’s bijvoorbeeld ‘NAN’ zullen terugkeren voor lege waarden. Omdat het geen string is, moet je het omzetten in één om het te evenaren. Bijvoorbeeld:

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)

Other episodes