pandasによる効果的なデータ前処理
前節の表は、最初からきれいにそろっていました。しかし現場で集まってくるデータは、こうはいきません。
複数の店舗やシステムから寄せ集めた明細には、半角カナと全角カナの混在、数字の全角・半角、前後に紛れ込んだ空白、そして空欄――いわゆる表記ゆれや欠損がつきものです。本節では、こうしたふぞろいなデータを、pandasで再現可能な手順へと整える方法を確認していきます。
題材として、複数店舗から集めた売上明細を想定し、次の表をシートの左上(例:A1:C7)に入力してください。前節の整った表とは違い、半角カナ・全角数字・余分な空白・空欄をあえて含んでいます。
| 商品カテゴリ | 地域 | 売上 |
| スキンケア | 東日本 | 120000 |
| スキンケア | 西日本 | 85000 |
| メイク | 東日本 | 98000 |
| ヘアケア | 西日本 | |
| メイク | 東日本 | 210000 |
| ヘアケア | 東日本 | 53000 |
クレンジング:全角半角、空白、表記ゆれ
まずxl()でこの表を読み込むと、ばらつきはそのままDataFrameに取り込まれます。スキンケア(半角カナ)、東日本 (末尾に全角空白)、98000(全角数字)、そして売上の空欄がNaNとして並びます。
Excelであれば、こうしたゆれは目で見て1セルずつ直すか、関数を組み合わせて吸収することになりますが、手順が残りにくく、件数が増えるほど対応しきれなくなります。pandasでは、整え方を「ルール」としてコードに書き、列まるごとに一括適用します。空いているセルで=PY(を開始し、次のコードを入力してください。
df = xl("A1:C7", headers=True)
for col in ["商品カテゴリ", "地域"]:
df[col] = df[col].str.strip().str.normalize("NFKC")
df["売上"] = pd.to_numeric(df["売上"].astype(str).str.normalize("NFKC"), errors="coerce")
df
Ctrl+Enterで確定すると、表記がそろい、売上が数値になったDataFrameが表示されます。
ここで使った道具は3つです。
-
str.strip():前後の空白を(全角空白も含めて)落とします -
str.normalize("NFKC"):半角カナや全角英数を標準形にそろえる正規化です -
pd.to_numeric(..., errors="coerce"):文字列を数値に変換し、変換できない値(ここでは空欄)を欠損NaNとして扱います
for col in [...]では複数の列に同じ処理をまとめて実行しています。実行すると全体として表記がそろい、合計や平均といった集計に進める状態が得られます。
なお「東京」と「東京都」のように、正規化だけでは吸収できない意味的なゆれは、df["地域"].replace({"東京都": "東京"})のように対応表で個別に置き換えます。住所の文字列から都道府県だけを抜き出すといった抽出も、正規表現を使ったstr.extractで同じ流儀で書けます。
整え方を一度コードにしておけば、翌月以降の同じデータにもそのまま再適用できる点が利点です。
欠損値処理:補完・除外の判断基準
欠損とは、値が入っていない状態のことで、pandasではNaN(Not a Number)として表されます。
対処を決める前に、まずどの列にいくつあるかを把握します。df.isna()がセルごとに欠損かどうかを返し、.sum()で列ごとの件数が得られます。売上に1件の欠損があることを確認したら、続けて売上の平均で補完してみましょう。
df.isna().sum() # 列ごとの欠損数を確認(売上に1件) df_filled = df.copy() df_filled["売上"] = df_filled["売上"].fillna(df["売上"].mean()) df_filled
df_filledでは4行目(インデックス3)の売上が平均値113200で埋まったことが確認できます。
欠損の扱いには、大きく3つの方針があります。
-
補完(
fillna):平均・中央値・代表値で置き換える。件数を減らしたくないときに向くが、乱用するとデータが歪む可能性があり注意が必要。 -
除外(
df.dropna(subset=["売上"])):欠損が分析の前提を崩すとき、十分なデータ量があるときに選ぶ -
別カテゴリ化(
fillna("未回答")):欠損そのものに意味があるときに使う
いずれの場合も、元のdfは壊さずdf_filledのような別名に結果を残しておけば、判断を後から比較・やり直しできます。
このように、ふぞろいなデータも、正規化・数値化・欠損処理という手順を読めるコードとして積み重ねれば、前節で見たような整った表へと近づけられます。
