pandasでデータの文字列NA/NDが欠損値として認識されない時の対処法

2018年12月5日

pandasにおける欠損値

実験系のデータセットなどでは、空欄がNA, N.A.(Not analyzed)やND, N.D.(Not detected)で補完されていることがあります。pandasでは、NAやNDはただの文字列(object)として認識されているため、そのままの状態ではdropna()、fillna()、isnull()関数を用いた欠損値に対する一括処理をすることができません。

pandasで以下のものが欠損値として認識されます。

  • NaN
  • None
  • np.nan
  • math.nan

NAやNDという文字列は上記のいずれかに変換する必要があります。

NAやNDに対する処理

NA、ND、NaNを含むサンプルデータを作成。

In [1]: 
import numpy as np 
import pandas as pd 
df = pd.DataFrame({'A': [ 1, 'ND', 2, 3], 
                   'B': [ 4,'NA', 5, 6], 
                   'C': [ 7, 'ND', None, np.nan]})
Out[1]
     A	B	 C
0    1	4	  7
1   ND NA	 ND
2    2	5	NaN
3    3	5	NaN

Noneやnp.nanは欠損値として認識、カウントされていますが、NDやNAはFalseとなっています。
isnull():欠損値ならTrueを返す
isnull.sum():欠損値を集計

In [2]: df.isnull()
Out[2]:
       A	  B	  C
0	False	False	False
1	False	False	False
2	False	False	True
3	False	False	True

In [3]: df.isnull().sum()
Out[3]:
A    0
B    0
C    2
dtype: int64

replace関数で文字列NDを置き換え

In [4]: df = df.replace('ND', np.nan)
Out[4]:
     A	B	 C
0    1	4	  7
1  NaN NA	NaN
2    2	5	NaN
3    3	5	NaN

isnull()やfillna()が適用できるようになりました。

In [5]: df.isnull()
Out[5]:
       A	  B	  C
0	False	False	False
1	True	 False	 True
2	False	False	True
3	False	False	True

In [6]: df.isnull().sum()
Out[6]:
A    2
B    0
C    2
dtype: int64

In [7]: df.fillna(10)
Out[7]:
     A	B	 C
0    1	4	  7
1   10 NA	 10
2    2	5	 10
3    3	5	 10