2017-02-04 309 views
3

有人可以看到爲什麼這不起作用嗎?我試圖從我的Python List /數組中刪除nan值。從Python列表中刪除nan值

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

回答

7

在你的函數的控制流是沒有意義的 - 你設置一個變量xnan,然後檢查它是否確實nan在循環並將其設置爲0。你從來沒有接觸,也沒有檢查所有的數組的元素。

要正確地將您的nan值轉換爲0,您可以簡單地使用numpy.nan_to_num,因爲看起來您正在使用NumPy數組。

演示

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]) 

如果你更感興趣的是具有用於常規的Python列表的方法的功能的版本,你可以嘗試這樣的事情,或列表理解爲fafl已提供。

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

米奇的答案可能是最好的辦法。如果你想手動寫這個,你可以做類似

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