1. ホーム
  2. python

[解決済み] Python / numpy / pandasで任意のオブジェクトがNaNかどうかを効率的にチェックする?

2022-07-31 15:04:59

質問

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

直感的に私は numpy.isnan(val) を使っていましたが、これは val がサポートする型のサブセットに含まれていない限り、うまく動作します。 numpy.isnan() . 例えば、文字列フィールドではデータが欠落することがあり、その場合、次のようになります。

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

例外を捕捉して False を返す高価なラッパーを書く以外に、これをエレガントかつ効率的に処理する方法はないのでしょうか?

どのように解決するのですか?

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