【python】DataFrame, Seriesの欠損値の補完,削除

pandasのDataFrameやSeriesで、欠損値が含まれていると色々と面倒な事もある。
事前に欠損値の補完や、欠損データの削除をしておく方法。

準備

欠損値のデータを作るために、numpyのnanを使う。

import pandas as pd
from pandas import Series , DataFrame
import numpy as np
from numpy import nan

Seriesの場合

#テスト用のシリーズの作成。
data = Series([1,2,nan,4])

data

#出力結果
0    1.0
1    2.0
2    NaN
3    4.0
dtype: float64

欠損値が含まれるかを調べる

シリーズに欠損値が含まれているかどうかは、isnull()を使用する。
データがNaNの場合は、Trueが返ってくる。

data.isnull()

#出力結果
0    False
1    False
2     True
3    False
dtype: bool

欠損データの削除

欠損値を削除するには、dropna()を使用する。

0    1.0
1    2.0
3    4.0
dtype: float64

欠損データの補完

欠損データを補完するには、fillna()を使用する

data.fillna(10)

#出力結果
0     1.0
1     2.0
2    10.0
3     4.0
dtype: float64

DataFrameの場合

#テスト用のDataFrameの作成
dframe = DataFrame([[1,2,3,5],[4,nan,5,6],[nan,7,nan,8],[nan,nan,nan,nan]])

dframe

#出力結果
	0	1	2	3
0	1.0	2.0	3.0	5.0
1	4.0	NaN	5.0	6.0
2	NaN	7.0	NaN	8.0
3	NaN	NaN	NaN	NaN

欠損データの削除

Series同様に、dropna()で欠損データを削除する事ができる。
行の中に1つでもNaNが含まれている場合は、行単位で削除される

dframe.dropna()

#出力結果
	0	1	2	3
0	1.0	2.0	3.0	5.0


行の全てがNaNの場合に削除するには、how='all'を指定する

dframe.dropna(how='all')

#出力結果
        0	1	2	3
0	1.0	2.0	3.0	5.0
1	4.0	NaN	5.0	6.0
2	NaN	7.0	NaN	8.0


欠損値がある列を削除するには、axis=1を指定する。

dframe.dropna(axis=1)

#出力結果
0
1
2
3


NaNじゃない数位がn個以上のある行だけを抜き出すには、thresh=nを指定する。

dframe.dropna(thresh=3)

#出力結果
    0	1	2	3
0	1.0	2.0	3.0	5.0
1	4.0	NaN	5.0	6.0

欠損データの補完

欠損データを補完するには、fillna()を使用する

dframe.fillna(100)

#出力結果
    0	1	2	3
0	1.0	2.0	3.0	5.0
1	4.0	100.0	5.0	6.0
2	100.0	7.0	100.0	8.0
3	100.0	100.0	100.0	100.0


fillna()に辞書型の値を渡すと、特定の列だけにfillna()を適用する事ができる。
◯列目は△~の様に、列毎に補完する値の指定も出来る。

dframe.fillna({3:3})

#出力結果
	0	1	2	3
0	1.0	2.0	3.0	5.0
1	4.0	NaN	5.0	6.0
2	NaN	7.0	NaN	8.0
3	NaN	NaN	NaN	3.0

まとめ

dropna(), fillna()を使う事で、欠損データを補完・削除する事が出来る。
データを処理する前に、前もって欠損データを精査する時に役立ちそう。