[python] 배열에서 nan 값 제거

배열에서 nan 값을 제거하는 방법을 알고 싶습니다. 내 배열은 다음과 같습니다.

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

에서 nan값을 x어떻게 제거 합니까?



답변

배열에 numpy를 사용하는 경우 다음을 사용할 수도 있습니다

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

동등하게

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

[추가 된 속기 덕분에 chbrown에게 감사합니다]

설명

내부 함수 는 숫자가 아닌 모든 numpy.isnan값을 갖는 부울 / 논리 배열을 반환합니다 . 우리가 반대 할 때, 우리는 논리되지 연산자를 사용 과 배열을 가져 오는 그 모든 곳들 입니다 유효한 번호.Truex~Truex

마지막으로이 논리 형 배열을 사용 x하여 NaN 이외의 값만 검색하기 위해 원래 배열로 색인을 생성 합니다.


답변

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

v! = v 이후 NaN에 대해서만리스트와 numpy 배열에 모두 작동합니다.


답변

이 시도:

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

자세한 내용은 List Comprehensions를 참조하십시오 .


답변

나에게 @jmetz의 대답은 효과가 없었지만 팬더를 사용하면 isnull ()을 사용했습니다.

x = x[~pd.isnull(x)]


답변

위를 수행 :

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

또는

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

동일한 변수 (x)로 재설정해도 실제 nan 값이 제거되지 않고 다른 변수를 사용해야한다는 것을 알았습니다. 다른 변수로 설정하면 nan이 제거되었습니다. 예 :

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


답변

다른 사람들이 보듯이

x[~numpy.isnan(x)]

공장. 그러나 numpy dtype이 기본 데이터 유형이 아닌 경우 (예 : 객체 인 경우) 오류가 발생합니다. 이 경우 팬더를 사용할 수 있습니다.

x[~pandas.isna(x)] or x[~pandas.isnull(x)]


답변

허용 대답은 2 차원 배열의 모양을 변경합니다. Pandas dropna () 기능을 사용하여 여기에 해결책을 제시 합니다. 1D 및 2D 배열에서 작동합니다. 2D 경우 날씨를 선택하여을 포함 하는 행 또는 열드롭 할 수 있습니다 np.nan.

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

결과:

==================== 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.]