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
ディスカッション
コメント一覧
まだ、コメントがありません