【Python】PandasのDataFrameの欠損値の除去・補間を行おう!

こんにちは!

皆さんはPandasのDataFrameで欠損値があるものに出会ったことはありませんか?

Python初心者
実際のデータでは欠損値がない方が珍しいね!

欠損値があるデータでは、データ解析などには使用するのが難しいという問題があります。

そこで、欠損値にはなんらかの対処をする必要があります。

今回の記事では、以下の内容について紹介します。

  • DataFrameの欠損値を除去する方法
  • DataFrameの欠損値を補間する方法

今回はirisデータセットを用いて欠損値を故意に作成し、その欠損値に対応していきます。

from sklearn.datasets import load_iris
import pandas as pd
iris = load_iris()

df = pd.DataFrame(iris.data, columns=iris.feature_names)
df['species'] = iris.target_names[iris.target]

df.iloc[1, 1] = None

print(df.head())

実行結果

   sepal length (cm)  sepal width (cm)  ...  petal width (cm)  species
0                5.1               3.5  ...               0.2   setosa
1                4.9               NaN  ...               0.2   setosa
2                4.7               3.2  ...               0.2   setosa
3                4.6               3.1  ...               0.2   setosa
4                5.0               3.6  ...               0.2   setosa

sepal widthの2行目のデータに欠損値ができていることがわかります。

DataFrameの欠損値を除去する方法

DataFrameの欠損値を除去するには、「dropna()」を使います。

使い方によって、行を削除するか列を削除するかを選べます。

欠損値のある行を削除する

行を削除する時は、dropna()に何も指定する必要はありません。

明示的に指定する場合には、「axis=0」を指定します。

print(df.dropna().head())

実行結果

   sepal length (cm)  sepal width (cm)  ...  petal width (cm)  species
0                5.1               3.5  ...               0.2   setosa
2                4.7               3.2  ...               0.2   setosa
3                4.6               3.1  ...               0.2   setosa
4                5.0               3.6  ...               0.2   setosa
5                5.4               3.9  ...               0.4   setosa

[5 rows x 5 columns]

インデックス番号1のデータが消えていることがわかります。

欠損値のある列を削除する

列を削除する時は、「axis=1」を指定します。

print(df.dropna(axis=1).head())

実行結果

   sepal length (cm)  petal length (cm)  petal width (cm) species
0                5.1                1.4               0.2  setosa
1                4.9                1.4               0.2  setosa
2                4.7                1.3               0.2  setosa
3                4.6                1.5               0.2  setosa
4                5.0                1.4               0.2  setosa

sepal widthの列が消えていることがわかります。

DataFrameの欠損値を補間する方法

先ほど説明したように、欠損値を除去する場合には、欠損値の存在する行か列を削除しなければいけません。

しかし、欠損値が多く存在するデータでは、多くの行、列を削除しなければならなくなるため、多くの貴重なデータが失われてしまいます。

そこで、欠損値に対処する方法として、欠損値を補完する方法があります。

DataFrameの欠損値の補間方法は、用途によって様々な方法がありますが、今回は平均値、最頻値、中央値で補間してみます。

欠損値を補間するには、「fillna()」を使います。

各統計量を算出した後に、fillna()で算出した統計量を欠損値に補間していきます。

平均値で補間

平均値で補間するために、まず、各列ごとの平均値を算出します。

DataFrameの各列の平均値を算出するには、「mean()」を使います。

mean = df.mean()
print(mean)

実行結果

sepal length (cm)    5.843333
sepal width (cm)     3.057718
petal length (cm)    3.758000
petal width (cm)     1.199333
dtype: float64

各列ごとの平均値を算出することができました。

今回は、sepal widthの列が空白なので、この平均値を空白に埋めます。

fillna()にmeanを渡すと、自動で空白のある列に列の平均値を埋めてくれます。

print(df.fillna(mean).head())

実行結果

   sepal length (cm)  sepal width (cm)  ...  petal width (cm)  species
0                5.1          3.500000  ...               0.2   setosa
1                4.9          3.057718  ...               0.2   setosa
2                4.7          3.200000  ...               0.2   setosa
3                4.6          3.100000  ...               0.2   setosa
4                5.0          3.600000  ...               0.2   setosa

[5 rows x 5 columns]

欠損値が平均値で埋められ、欠損値がなくなったことがわかります。

最頻値で補間

平均値と同様に補間していきましょう。

最頻値で補間するために、まず、各列ごとの最頻値を算出します。

DataFrameの各列の最頻値を算出するには、「mode().iloc[0]」を使います。

mode = df.mode().iloc[0]
print(mode)

実行結果

sepal length (cm)         5
sepal width (cm)          3
petal length (cm)       1.4
petal width (cm)        0.2
species              setosa
Name: 0, dtype: object

その後、fillna()に結果を渡します。

print(df.fillna(mode).head())

実行結果

   sepal length (cm)  sepal width (cm)  ...  petal width (cm)  species
0                5.1               3.5  ...               0.2   setosa
1                4.9               3.0  ...               0.2   setosa
2                4.7               3.2  ...               0.2   setosa
3                4.6               3.1  ...               0.2   setosa
4                5.0               3.6  ...               0.2   setosa

[5 rows x 5 columns]

欠損値が最頻値で埋められ、欠損値がなくなったことがわかります。

中央値で補間

同様に補間していきましょう。

中央値で補間するために、まず、各列ごとの最頻値を算出します。

DataFrameの各列の中央値を算出するには、「median()」を使います。

median = df.median()
print(median)

実行結果

sepal length (cm)    5.80
sepal width (cm)     3.00
petal length (cm)    4.35
petal width (cm)     1.30
dtype: float64

その後、fillna()に結果を渡します。

print(df.fillna(median).head())

実行結果

   sepal length (cm)  sepal width (cm)  ...  petal width (cm)  species
0                5.1               3.5  ...               0.2   setosa
1                4.9               3.0  ...               0.2   setosa
2                4.7               3.2  ...               0.2   setosa
3                4.6               3.1  ...               0.2   setosa
4                5.0               3.6  ...               0.2   setosa

[5 rows x 5 columns]

欠損値が中央値で埋められ、欠損値がなくなったことがわかります。

まとめ

今回の記事では、以下の内容を紹介しました。

  • DataFrameの欠損値を除去する方法
  • DataFrameの欠損値を補間する方法
Python初心者
欠損値への対象は重要だね!

しっかりと欠損値の除去・補間方法を覚えて、欠損値のあるデータも扱えるようになりましょう!