developer tip

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

copycodes 2020. 10. 19. 08:13
반응형

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) 값으로 간주됩니다.


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

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

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


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만이 자신과 같지 않기 때문입니다.

참고 URL : https://stackoverflow.com/questions/36000993/numpy-isnan-fails-on-an-array-of-floats-from-pandas-dataframe-apply

반응형