2017-02-04 3 views
3

Может кто-нибудь понять, почему это не работает? Я пытаюсь удалить значения nan из моего списка/массива python.Удаление значений nan из списка Python

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

Поток управления в функции не имеет смысла - установить переменную x быть nan, а затем проверить, если это действительно nan в цикле и установите его в 0. Вы никогда не прикасаться ни проверить любого из элементы массива.

Чтобы правильно преобразовать значения nan в 0, вы можете просто использовать numpy.nan_to_num, поскольку он работает с массивами NumPy.

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

Если вы больше заинтересованы в том, функционирующую версию подхода для обычного списка 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] 

 Смежные вопросы

  • Нет связанных вопросов^_^