
データ分析の9割は前処理と整形です。ここをpandasで素早く正確にこなせるかが、成果物の質と速度を決めます。本記事は未経験〜初学者が週10時間×2〜3週で、pandasの基礎(読み込み/選択/整形/結合/集計/欠損/日時/ピボット/出力)を実務でそのまま使える型で習得できるよう設計しました。最後に月末ミニプロジェクト(売上データの整形→可視化→示唆)まで作り切ります。
この記事で身につくこと
- pandas 2.x 基本操作の“実務の型”
- loc/iloc・groupby/pivotの使い分け基準
- 欠損・重複・型の安全なハンドリング
- メソッドチェーン&
pipe
で読みやすい整形フロー - Excel/CSV/Parquetへの配布・保存テンプレ
まずは“つまずきポイント”を共有します
ここで迷いやすい分岐点を先に押さえましょう。判断軸を決めておくと、後工程の破綻が一気に減ります。
loc
とiloc
、どっちをいつ使うかが曖昧でバグる。groupby
とpivot_table
、何が違うか分からない。- 1セルずつ直してfor地獄、処理が遅い・壊れやすい。
- 欠損・重複・型の扱いを後回し → 後工程でハマる。
この記事の方針(現場メモ)
筆者(ふみと)は大手企業でデータサイエンティスト/マーケティングサイエンティスト歴10年。100件超の案件で最後に残ったのは、「再現可能で読みやすい整形コード」でした。ここでは毎日使っている“動く書き方だけ”に絞って解説します。
前提とサンプルデータ
以降は pandas 2.x / Python 3.10+ を想定。import pandas as pd
を前提に進めます。例では次のCSVを使います。
sales.csv
(列:date, store, product, qty, price
)stores.csv
(列:store, area, open_date
)
pandas“実務の型”10ステップ
1) 読み込み・基本確認(I/O)
import pandas as pd
# CSV読み込み(日付パース/型指定/欠損値の文字列指定)
df = pd.read\_csv(
"sales.csv",
parse\_dates=\["date"],
dtype={"store": "category", "product": "category"},
na\_values=\["", "NA", "null"]
)
# 先頭/末尾/サマリ
print(df.head())
print(df.tail(3))
print(df.info())
print(df.describe(numeric\_only=True))
判断基準:I/Oの段階で日付とカテゴリ型を入れておくと、後工程が安定します。
2) 行・列の選択(loc/iloc/at/iat)
# 列選択
cols = ["date", "store", "qty", "price"]
df2 = df[cols]
# 行フィルタ(ブール)
mask = (df\["qty"] > 0) & (df\["price"] > 0)
df3 = df.loc\[mask]
# 位置ベース(iloc)、ラベルベース(loc)
row5 = df.iloc\[5] # 5行目(0始まり)
subset = df.loc\[:, \["date", "store", "qty"]]
# 単一セルの高速アクセス
cell = df.at\[0, "qty"]
判断基準:
・列名/行ラベルで取る→loc
、位置で取る→iloc
・単一セルは at/iat
が高速
3) 列の生成・置換・削除(assign/rename/drop)
# 新列生成とメソッドチェーン
out = (
df
.assign(amount=lambda d: d["qty"] * d["price"], # 売上金額
ym=lambda d: d["date"].dt.to_period("M").astype(str))
.rename(columns={"store": "store_id"})
)
# 列削除
out = out.drop(columns=\["product"]) # 不要なら落とす
判断基準:メソッドチェーン(assign→rename→…
)で上から下へ流れるコードに。
4) 欠損・重複の処理(isna/fillna/dropna/duplicated)
# 欠損の確認
na_counts = df.isna().sum()
# 数値は中央値/平均、カテゴリは最頻値で補完の例
num\_cols = \["qty", "price"]
cat\_cols = \["store", "product"]
from statistics import median
fill\_values = {"qty": df\["qty"].median(), "price": df\["price"].median()}
df\["qty"] = df\["qty"].fillna(fill\_values\["qty"])
df\["price"] = df\["price"].fillna(fill\_values\["price"])
# 重複行の検出と削除(キーを指定)
dups = df.duplicated(subset=\["date", "store", "product"], keep="last")
df = df.loc\[\~dups].copy()
判断基準:補完は分析目的に与える影響をコメントで明示(例:中央値補完→分布の歪みは小)。
5) 集計(groupby/agg/value_counts)
# 店舗×月の売上合計/数量合計
monthly = (
out
.groupby(["ym", "store_id"], as_index=False)
.agg(sales=("amount", "sum"), qty=("qty", "sum"))
)
# 上位商品(単純集計)
rank = df\["product"].value\_counts().head(10).reset\_index(names=\["product", "count"])
判断基準:groupby(..., as_index=False)
でインデックス問題を避けると後工程が安定。
6) ピボット(pivot_table)と整形(stack/unstack)
# 月×店舗の売上ピボット(行:月、列:店舗)
pv = pd.pivot_table(
data=monthly,
index="ym", columns="store_id",
values="sales", aggfunc="sum", fill_value=0
)
# ロング↔ワイド変換
long\_df = pv.reset\_index().melt(id\_vars="ym", var\_name="store\_id", value\_name="sales")
判断基準:分析はロング、レポートはワイドが基本。都度melt/pivot
で往復可能に。
7) 結合(merge)と参照データの付与
stores = pd.read_csv("stores.csv", parse_dates=["open_date"], dtype={"store": "category"})
# 左結合:売上に店舗属性を付与
joined = (
df
.merge(stores.rename(columns={"store": "store_id"}), on="store_id", how="left")
)
判断基準:結合前にキーの重複と型を必ず確認(value_counts
, dtype
)。
8) 日時・期間(dtアクセサ / resample / rolling)
# 週次の売上集計(リサンプリング)
weekly = (
out
.set_index("date")
.resample("W-MON")
.agg(sales=("amount", "sum"), qty=("qty", "sum"))
.reset_index()
)
# 移動平均(直近4週)
weekly\["ma4"] = weekly\["sales"].rolling(window=4, min\_periods=1).mean()
判断基準:時系列はインデックスを日時にしてresample/rolling
を使う。
9) 出力(CSV/Excel/Parquet)
# CSV(日本語環境のExcel向け:UTF-8 BOM)
monthly.to_csv("monthly_sales.csv", index=False, encoding="utf-8-sig")
# Excel(複数シート)
with pd.ExcelWriter("report.xlsx") as xw:
monthly.to\_excel(xw, sheet\_name="monthly", index=False)
rank.to\_excel(xw, sheet\_name="rank", index=False)
# Parquet(高速/省サイズ)
monthly.to\_parquet("monthly.parquet", index=False)
判断基準:反復利用前提ならParquet、配布はExcel/CSV。
10) 高速化・可読性(vectorize/pipe/query)
# ベクトル化:行ループより列演算
out["unit_price"] = out["amount"] / out["qty"].where(out["qty"] != 0, other=pd.NA)
# pipeで処理を段階化
def add\_amount(d: pd.DataFrame) -> pd.DataFrame:
return d.assign(amount=d\["qty"] \* d\["price"])
def add\_ym(d: pd.DataFrame) -> pd.DataFrame:
return d.assign(ym=d\["date"].dt.to\_period("M").astype(str))
result = df.pipe(add\_amount).pipe(add\_ym)
# queryで可読性UP(※列名に空白/記号がない前提)
filtered = result.query("qty > 0 and price > 0 and store == 'A01'")
判断基準:行ループ禁止(for
で1行ずつ処理は極力しない)。pipe
で小さな関数に分ける。
最短で“業務で使える”到達にする学び方
- 本記事の10ステップをJupyterで順に実行し、都度ノートに判断基準を書き込む。
sales.csv
を自作(またはKaggleのサンプル)し、読み込み→整形→集計→出力を関数化+pipeで再現。- 仕上げにExcel出力とParquet保存まで実装して再現性を担保。
途中で詰まる人は、質問対応とレビューのあるスクールを併用すると挫折率が激減します。下のCTAから無料相談であなた専用の6ヶ月計画を作ってもらうのが近道です。
TechAcademy データサイエンスコース(受講料:174,600円~ ※更に割引あり)

株式会社キカガク AI人材長期育成コース(受講料:237,600円~)

ミニプロジェクト(提出推奨):店舗別×月別ダッシュボード素材を作る
sales.csv
を読み込み、amount=qty*price
とym
を作成。ym, store
でsales=sum(amount), qty=sum(qty)
を集計。pivot_table
でym×store
のワイド表を作成し、report.xlsx
に出力。- 可視化(棒/折れ線)で上位店舗のトレンドを1枚に。
- 3行まとめで示唆を書いてREADMEに追記。
import pandas as pd
def load\_sales(path: str) -> pd.DataFrame:
return pd.read\_csv(path, parse\_dates=\["date"], dtype={"store": "category", "product": "category"})
def make\_features(df: pd.DataFrame) -> pd.DataFrame:
return (
df.assign(amount=lambda d: d\["qty"] \* d\["price"],
ym=lambda d: d\["date"].dt.to\_period("M").astype(str))
)
def aggregate\_monthly(d: pd.DataFrame) -> pd.DataFrame:
return (
d.groupby(\["ym", "store"], as\_index=False)
.agg(sales=("amount", "sum"), qty=("qty", "sum"))
)
def pivot\_monthly(monthly: pd.DataFrame) -> pd.DataFrame:
return pd.pivot\_table(monthly, index="ym", columns="store", values="sales", aggfunc="sum", fill\_value=0)
if **name** == "**main**":
df = load\_sales("sales.csv")
monthly = aggregate\_monthly(make\_features(df))
pv = pivot\_monthly(monthly)
with pd.ExcelWriter("report.xlsx") as xw:
monthly.to\_excel(xw, sheet\_name="monthly", index=False)
pv.to\_excel(xw, sheet\_name="pivot")
print("Saved report.xlsx")
>>【保存版】可視化入門:Matplotlib/Plotlyの使い分けと“伝わるグラフ設計”10ステップ
>>【実務で差がつく】pandas実践:欠損処理・結合・ウィンドウ関数・時系列・品質保証まで“読みやすく速い”型を習得
付録A:よく使うレシピ集(コピペ可)
# 1) 条件で置換(マスク書き換え)
mask = (df["qty"] < 0)
df.loc[mask, "qty"] = 0
# 2) カテゴリ順序を固定
cat = pd.CategoricalDtype(\["S", "M", "L"], ordered=True)
df\["size"] = df\["size"].astype(cat)
# 3) 文字列→数値(通貨/カンマ除去)
df\["price"] = (df\["price"].astype(str)
.str.replace(",", "", regex=False)
.astype(float))
# 4) 正規表現で抽出
df\["sku"] = df\["text"].str.extract(r"SKU-(\d+)")
# 5) 異常値のWinsorize(上位1%を上限)
q99 = df\["amount"].quantile(0.99)
df\["amount\_clip"] = df\["amount"].clip(upper=q99)
# 6) 複数条件の一括集計
agg = df.groupby("store").agg(
sales=("amount", "sum"),
cnt=("amount", "size"),
avg=("amount", "mean")
).reset\_index()
付録B:メモリ・速度最適化の要点
- 数値は最適なdtypeへ:
int64→int32
、float64→float32
(精度要件と相談) - 文字列キーはcategory型へ(
store/product
など) - 必要な列だけ読み込み(
usecols
) - 行ループ禁止、ベクトル演算・
map/replace/where/clip
を活用 - 大規模はPolars/SQLiteとの併用も検討 → [内部リンク:SQLite×Python]
FAQ:よくある質問
Q1. loc
とiloc
の使い分けは?
A. ラベル指定はloc
、位置指定はiloc
。単一セルはat/iat
が高速。
Q2. groupby
とpivot_table
の違いは?
A. 集計の基本はgroupby
、レポート向きのワイド表を作るならpivot_table
。往復はmelt/pivot
。
Q3. Excel前提の現場だと?
A. ExcelWriter
で複数シート出力、UTF-8 BOM
で文字化け回避。テンプレ納品にすると時短。
Q4. 欠損はどう埋める?
A. 目的次第。中央値/最頻値/ゼロ埋め/「不明」カテゴリ化など、影響をコメントに残す。
Q5. これで機械学習に進める?
A. はい。pandasの整形→[内部リンク:scikit-learn基礎] に接続し、[内部リンク:モデル評価] へ。
この記事から次に読むべきもの(内部リンク)
-
-
【実務で差がつく】pandas実践:欠損処理・結合・ウィンドウ関数・時系列・品質保証まで“読みやすく速い”型を習得
リード(結論)基礎を終えたら次は実務の現場で頻出する処理を“型”で覚える段階です。本記事は、pandas 2.x を前提に、欠損・外れ値・結合・ウィンドウ関数・時系列・カテゴリ処理・集計の自動化・大規 ...
-
-
【保存版】可視化入門:Matplotlib/Plotlyの使い分けと“伝わるグラフ設計”10ステップ
結論:可視化は「きれいに描く」ことではなく、意思決定を動かすための設計です。本稿では、未経験〜初学者が 週10時間×1〜2週 で、Matplotlib/Plotlyを軸に “伝わるグラフ”の設計と実装 ...
-
-
【保存版】scikit-learn基礎:回帰・分類・前処理・パイプライン・交差検証を“実務の型”で習得
機械学習で迷子になる最大の理由は、前処理→学習→評価→改善の順番が曖昧なまま個々のアルゴリズムに飛びつくこと。本記事は、未経験〜初学者が週10時間×2〜3週で到達できるscikit-learnの最短ル ...
-
-
はじめてのSQL:SELECT/WHERE/GROUP BYを最短で理解【コピペOK】
データ分析・自動レポート・簡易アプリの土台はSQLです。Pythonだけで押し切るより、前処理の7割をDB側で完結させる方が速く・安定します。本記事は、未経験〜初学者が週10時間×2〜3週で、SELE ...
-
-
【保存版】SQLite×Pythonで作る“ローカルDWH”——ETL・集計・レポート自動化の最短手順
ローカルでゼロ構築、ファイル1つで完結、サーバ不要。本記事はSQLite×Pythonで“毎日回る”ETL・集計・レポート自動化を最短で作るための完全ガイドです。データ設計→DB作成→ETL(取り込み ...
-
-
【保存版】データレポート納品の型:要件定義→ETL→検証→可視化→Excel/PDF→引き継ぎまで、失注しないワークフロー完全版
“いい分析”より“伝わる納品”。副業や実務で評価されるのは、意思決定に効く1枚と再現できるパッケージを期限通り出せること。 本記事は、未経験〜初学者が週10時間×2〜3週で、要件定義→データ受領→ET ...
それでは、また次の記事でお会いしましょう。
最近のコメント