機械学習:前処理 NaNの取扱:削除
Pythonの機械学習のモジュール、scikit-learnでは、Numpy.arrayを処理するため、データはNumpy array形式を使用するのが自然です。
が、機械学習を行う前段階でのデータ加工は、DataFrameの方がはるかに便利なので、ここではDataFrameを扱います。
import pandas as pd
import numpy as np
data=[[1, 2, ],
[4, np.nan, 6],
[None, 8, 9],
[10, 11, 12]]
columns=['A', 'B', 'C']
index=['a', 'b', 'c','d']
df=pd.DataFrame(data, index=index, columns=columns)
データセットdfがあったとします。
dfの出力はこのようになります。
データの欠測値
これはデータ行列内に存在する、空欄、もしくはNa(Not available)のことです。取得時にだけ起こるとは限らず、前行データとの差を求めた場合、もしくは移動平均を取った場合などにも現れます。
データセットdf中のNaNは’Not a number’の意味です。
まず、どれだけ欠損値があるかどうか調べるには、以下の関数を使います。
列毎の欠損値
df.isnull().sum()
行毎の欠損値
df.isnull().sum(axis=1)
これらNaNを含む行をとにかく全部消してしまいたい場合は、
df.dropna()
行ではなく列を消したい場合や、一つでもあれば全部削除してしまうとデータの意味がなくなる…な時は、
df.dropna(axis=1) #NaNを一つでも含む列を削除
df.dropna(how='all') #全ての列がNaNである行を削除
df.dropna(thresh=3) #非NaNが3つ未満である行を削除
df.dropna(subset=['C']) #列CにNaNを一つでも含む行を削除
で、手加減してあげることもできます。
しかし、NaNが存在するデータであることは変わりありません。
その時に使うのが補完です。