Pandasで欠損値を埋めるための方法をいくつか確認したのでまとめておく。fillna関数を使うと引数に渡した値で、NaNを埋められる。
まずは適当にNaNを含んだデータを生成する。
import numpy as np import pandas as pd df = pd.DataFrame(data=[1,2,4,np.nan,5,8,7,np.nan], columns=['col_nan']) df
| index | col_nan |
|---|---|
| 0 | 1.0 |
| 1 | 2.0 |
| 2 | 4.0 |
| 3 | NaN |
| 4 | 5.0 |
| 5 | 8.0 |
| 6 | 7.0 |
| 7 | NaN |
ゼロで埋める
fillna関数を使うと引数に渡したもので、NaNを埋められる。
fillna(0)とするとNaNをゼロ埋め、fillna(5)とするとNaNを5で埋めてくれる。
df['col_fill_0'] = df.col_nan.fillna(0) df
| index | col_nan | col_fill_0 | col_fill_mean |
|---|---|---|---|
| 0 | 1.0 | 1.0 | 1.0 |
| 1 | 2.0 | 2.0 | 2.0 |
| 2 | 4.0 | 4.0 | 4.0 |
| 3 | NaN | 0.0 | 4.5 |
| 4 | 5.0 | 5.0 | 5.0 |
| 5 | 8.0 | 8.0 | 8.0 |
| 6 | 7.0 | 7.0 | 7.0 |
| 7 | NaN | 0.0 | 4.5 |
平均値で埋める
mean()関数を使って列の平均値を求め、その平均値を使ってNaNを埋めることができる。
df['col_fill_mean'] = df.col_nan.fillna(df.col_nan.mean()) df
| index | col_nan | col_fill_0 | col_fill_mean |
|---|---|---|---|
| 0 | 1.0 | 1.0 | 1.0 |
| 1 | 2.0 | 2.0 | 2.0 |
| 2 | 4.0 | 4.0 | 4.0 |
| 3 | NaN | 0.0 | 4.5 |
| 4 | 5.0 | 5.0 | 5.0 |
| 5 | 8.0 | 8.0 | 8.0 |
| 6 | 7.0 | 7.0 | 7.0 |
| 7 | NaN | 0.0 | 4.5 |
前後の値を元に補間で埋める
補間という言葉を知らなかったが、調べたら次のように出てきた。
補間(ほかん)とは、ある既知の数値データ列を基にして、そのデータ列の各区間の範囲内を埋める数値を求めること、またはそのような関数を与えること。
interpolate関数を使うと、前後の値を元に補間してくれる。
df['col_fill_interpolate'] = df.col_nan.fillna(df.col_nan.interpolate()) df
| index | col_nan | col_fill_0 | col_fill_mean | col_fill_interpolate |
|---|---|---|---|---|
| 0 | 1.0 | 1.0 | 1.0 | 1.0 |
| 1 | 2.0 | 2.0 | 2.0 | 2.0 |
| 2 | 4.0 | 4.0 | 4.0 | 4.0 |
| 3 | NaN | 0.0 | 4.5 | 4.5 |
| 4 | 5.0 | 5.0 | 5.0 | 5.0 |
| 5 | 8.0 | 8.0 | 8.0 | 8.0 |
| 6 | 7.0 | 7.0 | 7.0 | 7.0 |
| 7 | NaN | 0.0 | 4.5 | 7.0 |
まとめ
今後使えそうな、NaNを埋める方法を3つ確認しておいた。なかなかゼロ埋めを多用することはなさそうなので、平均値か補間を使うことになりそう。ただ、補間は並び方でも偏りが出そうなので気をつけたい。