pandas~欠損値編~
まえがき
今回は、欠損値の処理について説明します。欠損値の処理は、最近流行りの機械学習においても非常に重要です。
pandasにおける欠損値
pandasにおける欠損値は型に依らず全てNaN(Not a Number)で表現されます。
また、Pythonの組み込み値であるNoneも欠損値として扱われます。
欠損値の確認
欠損値の確認は、isnull()とnotnull()を使います。
- isnull(): 欠損値があるかどうかを示す真偽値を持ったオブジェクトを返す(欠損値がTrue)
- notnull(): isnull()と反対の動作
import pandas as pd import numpy as np sr = pd.Series([1, 2, 3, np.nan, 8]) print(sr.isnull()) print(sr.notnull()) df = pd.DataFrame([[1., 2., 2.5, 4.5], [1., np.nan, np.nan, 5.], [2., 3., 3.5, np.nan]]) print(df.isnull()) print(df.notnull())
# 実行結果 # print(sr.isnull()) 0 False 1 False 2 False 3 True 4 False dtype: bool # print(df.notnull()) 0 True 1 True 2 True 3 False 4 True dtype: bool # print(df.isnull()) 0 1 2 3 0 False False False False 1 False True True False 2 False False False True # print(df.notnull()) 0 1 2 3 0 True True True True 1 True False False True 2 True True True False
欠損率
isnull()を応用することにより、カラム毎のの欠損率を計算できます。
import pandas as pd import numpy as np df = pd.DataFrame([[1., 2., 2.5, 4.5], [1., np.nan, np.nan, 5.], [2., 3., 3.5, np.nan], [3., np.nan, 5., 6.], [4., np.nan, np.nan, np.nan]]) print((df.isnull().sum() / len(df)) * 100)
# 実行結果 0 0.0 1 60.0 2 40.0 3 40.0 dtype: float64
欠損値を除外
欠損値の除外は、dropna()を使います。
欠損値のある軸が削除されます。
- dropna(axis): axisで指定した軸に欠損値があるかを調べ、抽出して除外する。
import pandas as pd import numpy as np df = pd.DataFrame([[1., 2., 2.5, 4.5], [1., np.nan, np.nan, 5.], [2., 3., 3.5, np.nan], [3., np.nan, 5., 6.], [4., np.nan, np.nan, np.nan]]) df_0 = df.dropna(axis=0) df_1 = df.dropna(axis=1) print(df_0) print(df_1)
# 実行結果 # print(df_0) 0 1 2 3 0 1.0 2.0 2.5 4.5 # print(df_1) 0 0 1.0 1 1.0 2 2.0 3 3.0 4 4.0
欠損値の穴埋め
欠損値の穴埋めは、fillna()を使います。
-fillna(value): 指定したvalueで穴埋めする。
import pandas as pd import numpy as np df = pd.DataFrame([[1., 2., 2.5, 4.5], [1., np.nan, np.nan, 5.], [2., 3., 3.5, np.nan], [3., np.nan, 5., 6.], [4., np.nan, np.nan, np.nan]]) df_0 = df.fillna(0) # 0で埋める df_mean = df.fillna(df.mean()) # 平均値で埋める df_median = df.fillna(df.median()) # 中央値で埋める print(df_0) print(df_mean) print(df_median)
# 実行結果 # print(df_0) 0 1 2 3 0 1.0 2.0 2.5 4.5 1 1.0 0.0 0.0 5.0 2 2.0 3.0 3.5 0.0 3 3.0 0.0 5.0 6.0 4 4.0 0.0 0.0 0.0 # print(df_mean) 0 1 2 3 0 1.0 2.0 2.500000 4.500000 1 1.0 2.5 3.666667 5.000000 2 2.0 3.0 3.500000 5.166667 3 3.0 2.5 5.000000 6.000000 4 4.0 2.5 3.666667 5.166667 # print(df_median) 0 1 2 3 0 1.0 2.0 2.5 4.5 1 1.0 2.5 3.5 5.0 2 2.0 3.0 3.5 5.0 3 3.0 2.5 5.0 6.0 4 4.0 2.5 3.5 5.0
あとがき
お疲れ様でした。今回は、欠損値の処理について簡単な説明しました。