SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Python in Excel実務入門:Excelデータ分析の新パラダイム

pandasでふぞろいなデータを分析資産に変える

Python in Excel実務入門:Excelデータ分析の新パラダイム 第2回

pandasによる効果的なデータ前処理

 前節の表は、最初からきれいにそろっていました。しかし現場で集まってくるデータは、こうはいきません。

 複数の店舗やシステムから寄せ集めた明細には、半角カナと全角カナの混在、数字の全角・半角、前後に紛れ込んだ空白、そして空欄――いわゆる表記ゆれや欠損がつきものです。本節では、こうしたふぞろいなデータを、pandasで再現可能な手順へと整える方法を確認していきます。

 題材として、複数店舗から集めた売上明細を想定し、次の表をシートの左上(例:A1:C7)に入力してください。前節の整った表とは違い、半角カナ・全角数字・余分な空白・空欄をあえて含んでいます。

表:表記ゆれ・欠損を含む売上明細(A1:C7)
商品カテゴリ 地域 売上
スキンケア 東日本 120000
スキンケア 西日本 85000
メイク 東日本 98000
ヘアケア 西日本
メイク 東日本 210000
ヘアケア 東日本 53000

クレンジング:全角半角、空白、表記ゆれ

 まずxl()でこの表を読み込むと、ばらつきはそのままDataFrameに取り込まれます。スキンケア(半角カナ)、東日本 (末尾に全角空白)、98000(全角数字)、そして売上の空欄がNaNとして並びます。

 Excelであれば、こうしたゆれは目で見て1セルずつ直すか、関数を組み合わせて吸収することになりますが、手順が残りにくく、件数が増えるほど対応しきれなくなります。pandasでは、整え方を「ルール」としてコードに書き、列まるごとに一括適用します。空いているセルで=PY(を開始し、次のコードを入力してください。

python
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件の欠損があることを確認したら、続けて売上の平均で補完してみましょう。

python
df.isna().sum()  # 列ごとの欠損数を確認(売上に1件)

df_filled = df.copy()
df_filled["売上"] = df_filled["売上"].fillna(df["売上"].mean())
df_filled
isna().sum()で欠損件数を確認した結果
isna().sum()で欠損件数を確認した結果
平均補完後のdf_filled
平均補完後のdf_filled

 df_filledでは4行目(インデックス3)の売上が平均値113200で埋まったことが確認できます。

 欠損の扱いには、大きく3つの方針があります。

  • 補完fillna):平均・中央値・代表値で置き換える。件数を減らしたくないときに向くが、乱用するとデータが歪む可能性があり注意が必要。
  • 除外df.dropna(subset=["売上"])):欠損が分析の前提を崩すとき、十分なデータ量があるときに選ぶ
  • 別カテゴリ化fillna("未回答")):欠損そのものに意味があるときに使う

 いずれの場合も、元のdfは壊さずdf_filledのような別名に結果を残しておけば、判断を後から比較・やり直しできます。

 このように、ふぞろいなデータも、正規化・数値化・欠損処理という手順を読めるコードとして積み重ねれば、前節で見たような整った表へと近づけられます。

次のページ
groupby/mergeで集計と結合

この記事は参考になりましたか?

Python in Excel実務入門:Excelデータ分析の新パラダイム連載記事一覧
この記事の著者

WINGSプロジェクト 西 潤史郎(ニシ ジュンシロウ)

WINGSプロジェクト について>有限会社 WINGSプロジェクト が運営する、テクニカル執筆コミュニティ(代表 山田...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/29058 2026/08/03 08:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー