web-dev-qa-db-ja.com

Python / numpy / pandasで任意のオブジェクトがNaNであるかどうかを効率的にチェックしますか?

私のnumpy配列はnp.nanを使用して欠損値を指定します。データセットを反復処理する際、そのような欠損値を検出し、特別な方法で処理する必要があります。

単純にnumpy.isnan(val)を使用しました。これは、valnumpy.isnan()でサポートされている型のサブセットに含まれていない限り、うまく機能します。たとえば、文字列フィールドで欠落データが発生する可能性があります。

>>> np.isnan('some_string')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: Not implemented for this type

例外をキャッチしてFalseを返す高価なラッパーを書く以外に、これをエレガントかつ効率的に処理する方法はありますか?

82
Dun Peal

pandas.isnull()(新しいバージョンではpd.isna())は、数値配列と文字列/オブジェクト配列の両方の欠損値をチェックします。ドキュメントから、次のことを確認します。

数値配列のNaN、オブジェクト配列のNone/NaN

簡単な例:

import pandas as pd
import numpy as np
s = pd.Series(['Apple', np.nan, 'banana'])
pd.isnull(s)
Out[9]: 
0    False
1     True
2    False
dtype: bool

numpy.nanを使用して欠損値を表すという考え方は、pandasが導入したものであり、そのため、pandasに対処するツールがあります。

日時も(pd.NaTを使用する場合、dtypeを指定する必要はありません)

In [24]: s = Series([Timestamp('20130101'),np.nan,Timestamp('20130102 9:30')],dtype='M8[ns]')

In [25]: s
Out[25]: 
0   2013-01-01 00:00:00
1                   NaT
2   2013-01-02 09:30:00
dtype: datetime64[ns]``

In [26]: pd.isnull(s)
Out[26]: 
0    False
1     True
2    False
dtype: bool
139
Marius

あなたの型は本当にarbitrary意的ですか?あなたがそれがint floatまたはstringになることを知っているなら、あなたはちょうどすることができます

 if val.dtype == float and np.isnan(val):

numpyでラップされていると仮定すると、常にdtypeを持ち、floatとcomplexのみがNaNになります

15
Hammer