データに欠損値はつきものですが、そのままにしておくと、scikitlearnのKMeanなどを使うとエラーになってしまうので、処理しておく必要があります。
1つでも欠損値があったら、その行または列を取り除いてしまうのは楽でイイですが、データが減ります。
d = pd.DataFrame({'a':[1,2,3], 'b':[30,pd.np.nan,20]})
a b
0 1 30
1 2 NaN
2 3 20
#行方向
d.dropna(axis=0)
a b
0 1 30
2 3 20
# 列方向
d.dropna(axis=1)
a
0 1
1 2
2 3
何かの値で埋めることも可能です。
d.fillna(0)
a b
0 1 30
1 2 0
2 3 20
周辺からそれっぽい値をとってきてもらって埋めることも可能です。前(forward)後ろ(back)と行列で合計4種類のやり方があります。
d = pd.DataFrame({'a':[1,2,3], 'b':[30,pd.np.nan,20]})
a b
0 1 30
1 2 NaN
2 3 20
# 行方向に移動しながら、最新の有効な値で穴埋め
d.fillna(method='ffill')
a b
0 1 30
1 2 30
2 3 20
# 行方向に移動しながら、有効な値で後方の欠損値を埋める
d.fillna(method='bfill')
a b
0 1 30
1 2 20
2 3 20
# axisに1か'columns'を指定すると、列方向の移動に変わる。
d.fillna(method='ffill',axis=1)
a b
0 1 30
1 2 2
2 3 20
# 後ろ方向だと、最後の欠損値が埋まらないので注意
d.fillna(method='bfill',axis=1)
a b
0 1 30
1 2 NaN
2 3 20
もちろん先頭が欠損値でも同じ事が起きるので、壁をペンキで塗るときに、刷毛を返すみたいに、ffilleのあと、bfillするのがいいような気がします。
スポンサーサイト