1. ホーム
  2. python

[解決済み] Numpyのisan()が浮動小数点数の配列で失敗する(pandas dataframe applyより)

2022-07-26 16:22:11

質問

pandasのデータフレームに適用されたfloatの配列(通常の数値とnansの数値)があります。

何らかの理由で、numpy.isanはこの配列で失敗しています。しかし、以下に示すように、各要素はfloatであり、numpy.isanは各要素で正しく動作し、変数の型は間違いなく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 これは、オブジェクトまたはネイティブなdtypesの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値とみなされることに注意してください。