pandasでデータの文字列NA/NDが欠損値として認識されない時の対処法
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











ディスカッション
コメント一覧
まだ、コメントがありません