導入
生のデータには、欠損や型のずれが混ざっています。集計の前に整える「前処理」が、正確な分析のカギです。
説明
欠損を含むデータを、確認 → 補完 の順で整えます。
import pandas as pd
import numpy as np
import io
csv_text = """name,age,score
Tanaka,28,80
Suzuki,,95
Sato,22,
Ito,41,88"""
df = pd.read_csv(io.StringIO(csv_text))
print("--- 欠損の数 ---")
print(df.isna().sum())
# age は平均で、score も平均で埋める
df["age"] = df["age"].fillna(df["age"].mean())
df["score"] = df["score"].fillna(df["score"].mean())
print("--- 補完後 ---")
print(df)
read_csv は空欄を自動で NaN(欠損)として読み込みます。fillna で列ごとに平均を埋め、分析に使える状態にしました。
日付の文字列は、pd.to_datetime で日付型に変換すると「月ごと」などの集計がしやすくなります。
import pandas as pd
import io
csv_text = "date,sales\n2024-01-05,320\n2024-02-11,150\n2024-02-20,180"
df = pd.read_csv(io.StringIO(csv_text))
df["date"] = pd.to_datetime(df["date"])
df["month"] = df["date"].dt.month # 月だけ取り出す
print(df)
df["date"].dt.month のように、日付型からは月・曜日などの成分を簡単に取り出せます。
やってみよう
補完を fillna(0) に変えると、平均で埋めた場合と score の平均がどう変わるか比べてみましょう。
演習
上の name の表で、欠損補完後に score 列の平均を表示してください。
ヒント1を見る
fillna で埋めたあと df["score"].mean()。