Python Excel操作 逆引き集 | ExcelへDataFrameを書き出す

Python
スポンサーリンク

ゴールのイメージを先に共有する

ここまで「Excel → DataFrame」の話をしてきましたが、
現場ではその逆、「DataFrame → Excel」に書き出したい場面もめちゃくちゃ多いです。

DataFrame.to_excel('out.xlsx', index=False) は、
「今手元にある DataFrame を、そのまま Excel ファイルとして保存する」ための基本形です。
index=False は「行番号(インデックス)を Excel に書き出さないでね」という指定で、ここがとても重要なポイントになります。


一番シンプルな書き出し:to_excel の基本形

最小コードと挙動

import pandas as pd

data = {
    "date": ["2025-01-01", "2025-01-02"],
    "product": ["りんご", "みかん"],
    "amount": [1000, 800]
}

df = pd.DataFrame(data)

df.to_excel("out.xlsx", index=False)
Python

このコードを実行すると、カレントディレクトリに out.xlsx ができます。
中身はこんなイメージです。

dateproductamount
2025-01-01りんご1000
2025-01-02みかん800

index=False を付けているので、左端に「0,1,…」のような行番号列は出てきません。
これが「人に渡せるきれいなExcel」を作るうえで、かなり大事な指定です。


なぜ index=False がそんなに大事なのか

付けないとどうなるかを一度見ておく

df.to_excel("out_with_index.xlsx", index=True)
Python

もしくは、index を省略するとデフォルトで True です。

この場合、Excel側はこうなります。

dateproductamount
02025-01-01りんご1000
12025-01-02みかん800

左端に「0,1,…」という列が増えています。
これは pandas の「インデックス」であって、業務上の意味のあるIDではありません。

人に渡す帳票や、他システムに渡す中間ファイルでは、
このインデックス列が邪魔になることがほとんどなので、
基本的には index=False を付けておくのが“きれいな書き出し”の定番です。


実務での典型パターン:集計結果を Excel に出す

例:売上データを月次集計して Excel に保存

import pandas as pd

df = pd.read_excel("sales.xlsx", parse_dates=["日付"])

df["金額"] = pd.to_numeric(df["金額"], errors="coerce")

monthly = (
    df.assign(month=df["日付"].dt.to_period("M"))
      .groupby("month", as_index=False)["金額"].sum()
)

monthly.to_excel("sales_monthly.xlsx", index=False)
Python

ここでやっている流れは、

Excelから売上明細を読む
月単位で集計する
集計結果を別の Excel として書き出す

という、現場でめちゃくちゃよく出てくるパターンです。
index=False を付けているので、month金額 だけのシンプルな表になります。


シート名を指定して書き出す

sheet_name 引数を使う

デフォルトのシート名は "Sheet1" ですが、
業務では「集計」「明細」「2025年」など、意味のある名前を付けたいことが多いです。

monthly.to_excel(
    "sales_monthly.xlsx",
    index=False,
    sheet_name="月次集計"
)
Python

これで、月次集計 という名前のシートに書き出されます。
ファイル名とシート名の両方に意味を持たせておくと、後から見たときに迷いません。


複数の DataFrame を1つの Excel に書き出す

ExcelWriter を使うパターン

「月次集計」「店舗別集計」「元データの一部」など、
複数の表を1つのブックにまとめたいときは、ExcelWriter を使います。

import pandas as pd

df = pd.read_excel("sales.xlsx", parse_dates=["日付"])
df["金額"] = pd.to_numeric(df["金額"], errors="coerce")

monthly = (
    df.assign(month=df["日付"].dt.to_period("M"))
      .groupby("month", as_index=False)["金額"].sum()
)

by_store = (
    df.groupby("店舗", as_index=False)["金額"].sum()
)

with pd.ExcelWriter("sales_report.xlsx") as writer:
    monthly.to_excel(writer, sheet_name="月次集計", index=False)
    by_store.to_excel(writer, sheet_name="店舗別集計", index=False)
Python

ここでのポイントは、

with pd.ExcelWriter(...) as writer: で「書き込み用のブック」を開く
to_excel(writer, sheet_name=...) で、同じブックに複数シートを書き込む

という流れです。
これを覚えると、「Pythonで作ったレポートブック」を量産できるようになります。


列名や順番を整えてから書き出す

人に渡す前に「見た目」を少し整える

import pandas as pd

df = pd.read_excel("sales.xlsx", parse_dates=["日付"])
df["金額"] = pd.to_numeric(df["金額"], errors="coerce")

df = df.rename(columns={
    "日付": "Date",
    "商品": "Product",
    "金額": "Amount"
})

df = df[["Date", "Product", "Amount"]]

df.to_excel("sales_clean.xlsx", index=False)
Python

ここでは、

列名を英語にリネーム
列の順番を並べ替え
その状態で Excel に書き出し

という流れを踏んでいます。
「書き出す前に DataFrame をどう整えるか」が、実務ではかなり重要です。


つまずきやすいポイントと注意点

ファイルが開きっぱなしだと書き出せない

Excel で out.xlsx を開いたまま to_excel("out.xlsx") を実行すると、
「ファイルを開けません」「アクセスが拒否されました」的なエラーになります。

これは pandas ではなく OS 側の制約なので、
「書き出すファイルは Excel で閉じておく」が鉄則です。

上書きされることを意識する

同じファイル名で to_excel を実行すると、既存のファイルは上書きされます。
元データを消したくない場合は、必ず別名を付けるか、
_v1, _v2 のようにバージョンを分ける運用を考えてください。


小さな練習問題

練習1:簡単な DataFrame を作って Excel に書き出す

条件は次の通りです。

  1. date, product, amount の3列を持つ DataFrame を自分で作る
  2. to_excel("test_out.xlsx", index=False) で書き出す
  3. Excel で開いて、中身と列名を確認する

練習2:sales.xlsx を読み、月次集計して sales_monthly.xlsx に書き出す

条件は次の通りです。

  1. 日付を parse_dates で読み込む
  2. 金額を数値化する
  3. 月次で合計を出す
  4. index=False で Excel に書き出す

最後に

DataFrame.to_excel('out.xlsx', index=False) は、
「Pythonで加工した結果を、現場のExcel文化に戻してあげる」ための出口です。

ここを押さえておくと、

分析結果をそのまま共有できる
人が見やすい形でレポートを渡せる
「Pythonで処理 → Excelで最終確認」という流れが自然に作れる

ようになります。

タイトルとURLをコピーしました