機械学習:前処理 NaNの取扱:補完 pandasを使った例
NaNが入っているデータの扱いは、前記事で書いたようにNaNが入った行を削除するのがシンプルではありますが、同じ行の別の列には意味のある数字が入っていて、ざっくり削除してしまうデメリットの方が多い場合、平均値や中心値で置き換えることをした方が良いでしょう。
DataFrameのデータを扱っていると言う前提で、pandasを使うと以下のようになります。
例として使っているデータセットは全記事と同様で、
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)
出力データフレームが、こちらです。
![](https://assets.st-note.com/img/1687358051871-ADSa2OUFnU.png)
これを、NaN全て削除するとなると、最後のd行の(10.0,11.0,12.0)しか残りません。こんなへなちょこデータは滅多にないでしょうが、これを補完していきます。
まず、このデータの統計的な傾向を見るために、
df.describe()
とすると、出力は、以下のようになります。
![](https://assets.st-note.com/img/1687962141891-gAsD0NHdTc.png)
countは、NaNでないデータの数、meanは平均値、stdは標準偏差、minは最小値、maxは最大値で、25%、50%、75%はパーセンタイルで、50%は中心値となります。
この手続きは、データが膨大になればなるほど、必須です。全部を目で確認できるわけではないので、新しいデータセットに出会ったときは、最初にこのdescribeを行なってください。
ここで出てくる中心値、平均値で置き換えるには、
df.fillna(df.mean()) #平均値
![](https://assets.st-note.com/img/1687962760109-nR04DZKBCC.png)
df.fillna(df.median()) #中心値
![](https://assets.st-note.com/img/1687962862400-0eTx4iR77B.png)
NaNを置き換えるには、そのデータの特性が失われないように、慎重に行う必要があります。単純に平均値や中心値でなく、最も頻繁に出てくる値等で置き換えたい場合を次の記事で取り上げます。