初心者のためのpython入門

自分がつまづいたところやつまづきやすいところを中心に書いていきます。また、役に立つライブラリの紹介などをしていきます。

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

あとがき

お疲れ様でした。今回は、欠損値の処理について簡単な説明しました。