2017-02-04 2 views
3

Kann jemand sehen, warum das nicht funktioniert? Ich versuche, Nan Werte aus meiner Python-Liste/Array zu entfernen.Entfernen von Nan-Werten aus einer Python-Liste

import math 
import numpy as np 

def clean_List_nan(List): 
    Myarray=np.array(List) 
    x = float('nan') 
    for elem in Myarray: 
     if math.isnan(x): 
      x = 0.0 
    return Myarray 


oldlist =[nan, 19523.3211203121, 19738.4276377355, 19654.8478302742, 119.636737571360, 19712.4329437810, nan, 20052.3645613346, 19846.4815936009, 20041.8676619438, 19921.8126944154, nan, 20030.5073635719] 

print(clean_List_nan(oldlist)) 

Antwort

7

Der Steuerablauf in Ihrer Funktion macht keinen Sinn - eine Variable x gesetzt nan, zu sein, und dann prüfen, ob es in der Tat nan in der Schleife ist und setzen Sie ihn auf 0. Sie nie noch überprüfen berühren alle die Elemente des Arrays.

Um Ihre Werte nan richtig in 0 zu konvertieren, könnten Sie einfach numpy.nan_to_num verwenden, da es so aussieht, als würden Sie mit NumPy-Arrays arbeiten.

Demo

In[37]: arr 
Out[37]: 
array([   nan, 19523.32112031, 19738.42763774, 19654.84783027, 
      119.63673757, 19712.43294378,    nan, 20052.36456133, 
     19846.4815936 , 20041.86766194, 19921.81269442,    nan, 
     20030.50736357]) 

In[38]: np.nan_to_num(arr) 
Out[38]: 
array([  0.  , 19523.32112031, 19738.42763774, 19654.84783027, 
      119.63673757, 19712.43294378,  0.  , 20052.36456133, 
     19846.4815936 , 20041.86766194, 19921.81269442,  0.  , 
     20030.50736357]) 

Wenn Sie eine funktionierende Version eines Ansatzes in mit einer regelmäßigen Python-Liste mehr daran interessiert sind, könnten Sie so etwas wie dies versuchen oder eine Liste Verständnis als FAFL hat bereitgestellt.

In[39]: list(map(lambda x: 0.0 if math.isnan(x) else x, oldlist)) 
Out[39]: 
[0.0, 
19523.3211203121, 
19738.4276377355, 
19654.8478302742, 
119.63673757136, 
19712.432943781, 
0.0, 
20052.3645613346, 
19846.4815936009, 
20041.8676619438, 
19921.8126944154, 
0.0, 
20030.5073635719] 
2

Die Antwort von Mitch ist wahrscheinlich der beste Weg, es zu tun. Wenn Sie dies manuell schreiben möchten, können Sie etwas wie

cleanlist = [0.0 if math.isnan(x) else x for x in oldlist] 
tun
Verwandte Themen