機械学習:前処理 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の出力はこのようになります。

df

データの欠測値

これはデータ行列内に存在する、空欄、もしくはNa(Not available)のことです。取得時にだけ起こるとは限らず、前行データとの差を求めた場合、もしくは移動平均を取った場合などにも現れます。
データセットdf中のNaNは’Not a number’の意味です。
まず、どれだけ欠損値があるかどうか調べるには、以下の関数を使います。

  • 列毎の欠損値

df.isnull().sum()
df.isnull().sum()
  • 行毎の欠損値

df.isnull().sum(axis=1)
df.isnull.sum(axis=1)

これらNaNを含む行をとにかく全部消してしまいたい場合は、

df.dropna()
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が存在するデータであることは変わりありません。
 その時に使うのが補完です。

この記事が気に入ったらサポートをしてみませんか?