ゴールのイメージを先に共有する
ここまで「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 ができます。
中身はこんなイメージです。
| date | product | amount |
|---|---|---|
| 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側はこうなります。
| date | product | amount | |
|---|---|---|---|
| 0 | 2025-01-01 | りんご | 1000 |
| 1 | 2025-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 に書き出す
条件は次の通りです。
date,product,amountの3列を持つ DataFrame を自分で作るto_excel("test_out.xlsx", index=False)で書き出す- Excel で開いて、中身と列名を確認する
練習2:sales.xlsx を読み、月次集計して sales_monthly.xlsx に書き出す
条件は次の通りです。
- 日付を
parse_datesで読み込む - 金額を数値化する
- 月次で合計を出す
index=Falseで Excel に書き出す
最後に
DataFrame.to_excel('out.xlsx', index=False) は、
「Pythonで加工した結果を、現場のExcel文化に戻してあげる」ための出口です。
ここを押さえておくと、
分析結果をそのまま共有できる
人が見やすい形でレポートを渡せる
「Pythonで処理 → Excelで最終確認」という流れが自然に作れる
ようになります。
