Numpy isnan()は、floatの配列で失敗します(pandasデータフレームの適用から)


101

私はパンダのデータフレームの適用から出てくるフロートの配列(いくつかの通常の数、いくつかのナン)を持っています。

何らかの理由で、この配列で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

回答:


163

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

あなたはパンダを持っているので、pd.isnull代わりに使うことができます-オブジェクトのNumPy配列またはネイティブdtypeを受け入れることができます:

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値とも見なされることに注意してください。


3
ありがとう-pd.isnull()を使用しました。パフォーマンスへの影響もないようです。
tim654321 2016年

11

np.isnan()およびpd.isnull()の優れた代替は

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

ナンだけがそれ自身と等しくないからです。


よく知られている "ValueError:xxxの真理値があいまいです"が発生するため、配列では機能しない可能性があります。
MSeifert 2016

@MSeifertあなたはPythonについて話していますか?私はこの方法を使用して機械学習で何かをしているだけですが、よく知られているエラーが発生しなかったのはなぜですか?
ステイサム、

はい、あなたは以前にnumpyやpandasを使用したことがないようです。import numpy as np; a = np.array([1,2,3, np.nan])コードを使用して実行するだけです。
MSeifert 2016

@MSeifertええ、私はnumpyは初めてですが、コードは正常に実行され、エラーは発生しませんでした
Statham

In [1]:numpyをnpとしてインポートIn [2]:a = np.array([1,2,3、np.nan])In [3]:print a [1. 2. 3. nan] In [ 4]:a [3] == a [3]を印刷するFalse
Statham、

10

@unutbuの回答に加えて、パンダのnumpyオブジェクト配列をネイティブ(float64)型に強制できます。

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

errors = 'coerce'を指定すると、数値に解析できない文字列を強制的にNaNにすることができます。列タイプはdtype: float64であり、isnanチェックは機能するはずです


彼の名前はのようですunutbu;)
Dr_Zaszuś

@Dr_Zaszuśありがとう、修正済み
Severin Pappadeux

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.