web-gelistirme-sc.com

Bir diziden nan değerlerini çıkarma

Nan değerlerini dizilimden nasıl çıkaracağımı bulmak istiyorum. Bu gibi bir şey görünüyor: 

x = [1400, 1500, 1600, nan, nan, nan ,1700] #Not in this exact configuration

Python için nispeten yeniyim, bu yüzden hala öğreniyorum. Herhangi bir ipucu?

148
Dax Feliz

Dizileriniz için numpy kullanıyorsanız,

x = x[numpy.logical_not(numpy.isnan(x))]

Eşdeğer bir 

x = x[~numpy.isnan(x)]

[Eklenen steno için chbrown'a teşekkürler] 

Açıklama

İç işlev, numpy.isnan, True değerinin her yerde x bir sayı olmayan bir boolean/mantıksal dizi döndürür. Bunun tersini istediğimiz gibi, Trues ile her yerde x geçerli bir sayı olan bir dizi elde etmek için ~ mantıksal olmayan işlecini kullanırız.

Son olarak bu mantıksal diziyi sadece NaN olmayan değerleri almak için x orijinal dizisine dizine almak için kullanıyoruz.

261
jmetz
filter(lambda v: v==v, x)

hem listeler hem de numpy array .__ için çalışır.

39
udibr

Bunu dene:

import math
print [value for value in x if not math.isnan(value)]

Daha fazla bilgi için, Liste Anlayışlarını oku.

32
liori

Benim için @jmetz tarafından cevap işe yaramadı, ancak pandalar kullanarak isnull () yaptı.

x = x[~pd.isnull(x)]
12
Daniel Kislyuk

Yukarıdakileri yapmak:

x = x[~numpy.isnan(x)]

veya

x = x[numpy.logical_not(numpy.isnan(x))]

Aynı değişkene (x) sıfırlamanın asıl nan değerlerini kaldırmadığını ve farklı bir değişken kullanmak zorunda olduğunu tespit ettim. Farklı bir değişkene ayarlamak nans .. kaldırıldı, ör. 

y = x[~numpy.isnan(x)]
6
melissaOu

Diğerleri tarafından gösterildiği gibi 

x[~numpy.isnan(x)]

eserleri. Fakat eğer numpy dtype yerel bir veri tipi değilse, örneğin nesne ise hata verecektir. Bu durumda pandaları kullanabilirsiniz.

x[~pandas.isnan(x)]
2
koliyat9811

numpy kullanıyorsanız 

# first get the indices where the values are finite
ii = np.isfinite(x)

# second get the values
x = x[ii]
1
aloha

kabul edilen cevap 2d dizilerinin şeklini değiştirir. Burada Pandas dropna () işlevini kullanarak bir çözüm sunuyorum. 1 ve 2 boyutlu diziler için çalışır. 2B durumda, 'yi veya satırını veya sütunu bırakarak içeren np.nan' u seçebilirsiniz.

import pandas as pd
import numpy as np

def dropna(arr, *args, **kwarg):
    assert isinstance(arr, np.ndarray)
    dropped=pd.DataFrame(arr).dropna(*args, **kwarg).values
    if arr.ndim==1:
        dropped=dropped.flatten()
    return dropped

x = np.array([1400, 1500, 1600, np.nan, np.nan, np.nan ,1700])
y = np.array([[1400, 1500, 1600], [np.nan, 0, np.nan] ,[1700,1800,np.nan]] )


print('='*20+' 1D Case: ' +'='*20+'\nInput:\n',x,sep='')
print('\ndropna:\n',dropna(x),sep='')

print('\n\n'+'='*20+' 2D Case: ' +'='*20+'\nInput:\n',y,sep='')
print('\ndropna (rows):\n',dropna(y),sep='')
print('\ndropna (columns):\n',dropna(y,axis=1),sep='')

print('\n\n'+'='*20+' x[np.logical_not(np.isnan(x))] for 2D: ' +'='*20+'\nInput:\n',y,sep='')
print('\ndropna:\n',x[np.logical_not(np.isnan(x))],sep='')

Sonuç:

==================== 1D Case: ====================
Input:
[1400. 1500. 1600.   nan   nan   nan 1700.]

dropna:
[1400. 1500. 1600. 1700.]


==================== 2D Case: ====================
Input:
[[1400. 1500. 1600.]
 [  nan    0.   nan]
 [1700. 1800.   nan]]

dropna (rows):
[[1400. 1500. 1600.]]

dropna (columns):
[[1500.]
 [   0.]
 [1800.]]


==================== x[np.logical_not(np.isnan(x))] for 2D: ====================
Input:
[[1400. 1500. 1600.]
 [  nan    0.   nan]
 [1700. 1800.   nan]]

dropna:
[1400. 1500. 1600. 1700.]
0
Markus Dutschke

Bu, NaN'ler ve inf'ler için ndarray "X" süzme yaklaşımım. 

Herhangi bir NaN ve herhangi bir inf içermeyen bir satır haritası hazırlarım:

idx = np.where((np.isnan(X)==False) & (np.isinf(X)==False))

idx bir Tuple. İkinci sütun (idx[1]), dizinin endekslerini içerir; burada hiçbir NaN ya da inf bu sırada satırda bulunmaz.

Sonra:

filtered_X = X[idx[1]]

filtered_X, X içermez NaN veya inf içerir.

0
aerijman