こんにちは!
皆さんはPandasのDataFrameで欠損値があるものに出会ったことはありませんか?
欠損値があるデータでは、データ解析などには使用するのが難しいという問題があります。
そこで、欠損値にはなんらかの対処をする必要があります。
今回の記事では、以下の内容について紹介します。
- 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の欠損値を補間する方法
しっかりと欠損値の除去・補間方法を覚えて、欠損値のあるデータも扱えるようになりましょう!