よしたく blog

ITエンジニアとして自分が知らなかったことをまとめています

Pandasで欠損値を埋めるための方法

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つ確認しておいた。なかなかゼロ埋めを多用することはなさそうなので、平均値か補間を使うことになりそう。ただ、補間は並び方でも偏りが出そうなので気をつけたい。