【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()を使う事で、欠損データを補完・削除する事が出来る。
データを処理する前に、前もって欠損データを精査する時に役立ちそう。