pandasで欠損値を埋める方法を解説します。
欠損値を埋める
データセット
import pandas as pd
from sklearn.datasets import load_iris
iris_data = load_iris()
df = pd.DataFrame(
data = iris_data.data,
columns = iris_data.feature_names,
)
df["label"] = iris_data.target
df
load_irisのデータセットを使います。
欠損値確認
df.isnull().sum()
# ===== output =====
# sepal length (cm) 0
# sepal width (cm) 0
# petal length (cm) 0
# petal width (cm) 0
# label 0
isnullで欠損値がTrueになります。その合計を取ると、列ごとの欠損値の数になります。
今回のデータでは欠損値がないので、加工して作りましょう。
import random
drop_idx = [random.randint(0, len(df) - 1) for _ in range(10)]
df.loc[drop_idx, "sepal length (cm)"] = None
df.isnull().sum()
# ===== output =====
# sepal length (cm) 10
# sepal width (cm) 0
# petal length (cm) 0
# petal width (cm) 0
# label 0
drop_idxではランダムに10個の行番号を作っています。
drop_idxに対応した”sepal length”にNoneを入れて欠損値にしました。
df.loc[drop_idx]
drop_idxに対応する行を取り出します。これで欠損していたらOKです。
欠損値を埋める
col = "sepal length (cm)"
df[col] = df[col].fillna(df[col].mean())
df.loc[drop_idx]
# ===== output =====
# 140 5.852143 3.1 5.6 2.4 2
# 13 5.852143 3.0 1.1 0.1 0
# 101 5.852143 2.7 5.1 1.9 2
fillnaで欠損値を埋めることができます。上記では平均値を入れました。
drop_idxの行を抽出すると、確かに平均値が入っていますね。
他のパターン
col = "sepal length (cm)"
#中央値
df[col] = df[col].fillna(df[col].median())
#最大値
# df[col] = df[col].fillna(df[col].max())
#最小値
# df[col] = df[col].fillna(df[col].min())
#指定値
# df[col] = df[col].fillna(-1)
中央値や最大最小などでも埋めることができます。
まとめ
今回はfillnaで欠損値を埋める方法を解説しました。
データの傾向にあわせてどんな値で埋めるか決めていきましょう。
コメント