[python] Numpy isnan ()이 float 배열에서 실패합니다 (pandas 데이터 프레임 적용).

팬더 데이터 프레임에서 적용되는 플로트 배열 (일부 일반 숫자, 일부 nans)이 있습니다.

어떤 이유로 numpy.isnan이이 배열에서 실패하지만 아래에 표시된 것처럼 각 요소는 부동 소수점이고 numpy.isnan은 각 요소에서 올바르게 실행되며 변수 유형은 확실히 numpy 배열입니다.

무슨 일이야?!

set([type(x) for x in tester])
Out[59]: {float}

tester
Out[60]:
array([-0.7000000000000001, nan, nan, nan, nan, nan, nan, nan, nan, nan,
   nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan,
   nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan,
   nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan,
   nan, nan], dtype=object)

set([type(x) for x in tester])
Out[61]: {float}

np.isnan(tester)
Traceback (most recent call last):

File "<ipython-input-62-e3638605b43c>", line 1, in <module>
np.isnan(tester)

TypeError: ufunc 'isnan' not supported for the input types, and the inputs could not be safely coerced to any supported types according to the casting rule ''safe''

set([np.isnan(x) for x in tester])
Out[65]: {False, True}

type(tester)
Out[66]: numpy.ndarray



답변

np.isnan 네이티브 dtype (예 : np.float64)의 NumPy 배열에 적용 할 수 있습니다.

In [99]: np.isnan(np.array([np.nan, 0], dtype=np.float64))
Out[99]: array([ True, False], dtype=bool)

그러나 객체 배열에 적용될 때 TypeError를 발생시킵니다.

In [96]: np.isnan(np.array([np.nan, 0], dtype=object))
TypeError: ufunc 'isnan' not supported for the input types, and the inputs could not be safely coerced to any supported types according to the casting rule ''safe''

Pandas가 있으므로 pd.isnull대신 사용할 수 있습니다. 객체 또는 기본 dtype의 NumPy 배열을 허용 할 수 있습니다.

In [97]: pd.isnull(np.array([np.nan, 0], dtype=float))
Out[97]: array([ True, False], dtype=bool)

In [98]: pd.isnull(np.array([np.nan, 0], dtype=object))
Out[98]: array([ True, False], dtype=bool)

참고 None또한 객체 배열에 널 (null) 값으로 간주됩니다.


답변

np.isnan () 및 pd.isnull ()의 훌륭한 대체품은 다음과 같습니다.

for i in range(0,a.shape[0]):
    if(a[i]!=a[i]):
       //do something here
       //a[i] is nan

nan만이 자신과 같지 않기 때문입니다.


답변

@unutbu 답변 위에 pandas numpy 객체 배열을 네이티브 (float64) 유형으로 강제 할 수 있습니다.

import pandas as pd
pd.to_numeric(df['tester'], errors='coerce')

숫자 값으로 구문 분석 할 수없는 문자열이 NaN이되도록하려면 errors = ‘coerce’를 지정하십시오. 열 유형은 dtype: float64이며 isnan확인이 작동해야합니다.


답변

Pandas를 사용하여 csv 파일을 가져와야합니다.

import pandas as pd

condition = pd.isnull(data[i][j])


답변