Python | ファイル・OS 操作:pandas.DataFrame.to_excel

Python Python
スポンサーリンク

概要(to_excelは「DataFrameをExcelに保存」する最短ルート)

pandas.DataFrame.to_excelは、表(DataFrame)を.xlsxへ書き出す標準メソッドです。基本は「ファイル名」「シート名」「インデックス有無」を決めればOK。重要なのは、文字コードではなくExcel専用の“書き出しエンジン”(openpyxl/xlsxwriter)を理解し、ヘッダー・欠損・小数点表示・複数シート・既存ファイルへの追記などを適切に設定することです。


基本の書き出し(ここが重要)

最短の保存とインデックスの扱い

import pandas as pd

df = pd.DataFrame({"名前": ["田中", "鈴木"], "売上": [10000, 15000]})
df.to_excel("sales.xlsx", index=False)  # 左端の行番号を出さない
Python

index=Falseにすると、余計な行番号(インデックス)をExcelに出さず、見た目がそのまま表になります。

シート名・列の順・ヘッダー制御

df.to_excel(
    "sales.xlsx",
    sheet_name="Report",         # シート名
    columns=["名前", "売上"],     # 出力列の順と選択
    header=True,                 # ヘッダー行を出す(Falseなら非表示)
    index=False
)
Python

列順はcolumnsで固定すると、後工程(人の閲覧やインポート)で迷いません。


表示・欠損・配置の整え方(見やすさを決める設定)

欠損や小数の見え方を制御

import numpy as np

df = pd.DataFrame({"商品": ["A","B","C"], "単価": [350.0, np.nan, 280.12345]})
df.to_excel(
    "format.xlsx",
    index=False,
    na_rep="",            # 欠損(NaN)を空文字で出力
    float_format="%.2f"   # 小数は2桁で表示
)
Python

na_repで欠損の見え方を、float_formatで小数表示桁を揃えます(計算値は内部的には元の数値のままです)。

開始位置(行・列)をずらす

df.to_excel("placed.xlsx", sheet_name="Data", startrow=2, startcol=1, index=False)
Python

冒頭に説明文やロゴを先に書く想定なら、表の開始位置をずらしてレイアウトを整えます。

ヘッダー行の固定(スクロールしても見出しを維持)

df.to_excel("freeze.xlsx", index=False, freeze_panes=(1, 0))  # 1行目を固定
Python

freeze_panesで“見出し固定”ができます。行を固定するなら(1, 0)、列も固定するなら(1, 1)など。


複数シート・既存ファイルへの追記(ExcelWriterの使い方)

複数のDataFrameを別シートへ

import pandas as pd

with pd.ExcelWriter("multi.xlsx", engine="openpyxl") as w:
    pd.DataFrame({"A":[1,2]}).to_excel(w, sheet_name="Sheet1", index=False)
    pd.DataFrame({"B":[3,4]}).to_excel(w, sheet_name="Sheet2", index=False)
Python

ExcelWriterを使うと、1つのブックに複数シートを書けます。シートごとにto_excelへwriterを渡すのが型です。

既存ブックへ安全に追記・置換

with pd.ExcelWriter(
    "existing.xlsx",
    engine="openpyxl",
    mode="a",                        # 追記モード
    if_sheet_exists="replace"        # 同名シートがあれば置き換え("overlay" なども可)
) as w:
    df.to_excel(w, sheet_name="Report", index=False)
Python

既存に加える場合はmode=”a”。同名シートの扱いをif_sheet_existsで明示すると、事故(重複シート量産)を防げます。


書式・日付・数式の実務ポイント(必要なときだけ軽く使う)

日付や日時のフォーマット(xlsxwriterで一括設定)

import pandas as pd
from datetime import datetime

df = pd.DataFrame({"日付": [datetime(2025,12,15)], "売上": [120.5]})
with pd.ExcelWriter("datefmt.xlsx", engine="xlsxwriter", datetime_format="yyyy-mm-dd") as w:
    df.to_excel(w, index=False)
Python

xlsxwriterエンジンならdatetime_format/date_formatをExcelWriterで一括指定できます。openpyxlでも書けますが、細かな表示形式はopenpyxlでセル書式を直接設定するほうが自由度が高いです。

Excelの数式を書き込む(文字列でOK)

import pandas as pd
df = pd.DataFrame({"値":[10, 20]})
with pd.ExcelWriter("formula.xlsx", engine="openpyxl") as w:
    df.to_excel(w, sheet_name="S", index=False, startrow=1)
    # 合計セルを後から追加(pandasではセル書式は限定的。必要ならopenpyxlで)
    ws = w.book["S"]
    ws["A1"] = "値"
    ws["B3"] = "=SUM(B2:B3)"
Python

数式は「=SUM(…)」の文字列を入れればExcel側で計算されます。リッチな書式やグラフはopenpyxlで直接操作するのが定石です。


実務の安全設計(保存先・エンジン・パフォーマンス)

保存先の用意(親フォルダを先に作る)

from pathlib import Path
import pandas as pd

out = Path("reports") / "summary.xlsx"
out.parent.mkdir(parents=True, exist_ok=True)
pd.DataFrame({"x":[1,2]}).to_excel(out, index=False)
Python

ファイル出力前に親フォルダを作る癖をつけると、存在しないフォルダでの失敗を防げます。

エンジン選択の目安

  • 既存.xlsxへの追記・差し替えが多いなら openpyxl。
  • 日付フォーマットや条件付き書式などExcel側の見栄えを楽に整えたいなら xlsxwriter。 どちらもpipで導入(pip install openpyxl / pip install XlsxWriter)。未指定でもpandasが適切なエンジンを選ぶことが多いですが、迷ったら明示すると安心です。

大量行の書き出しの勘所

DataFrameが大きい場合は、余計な変換を避け、float_formatやna_repを最初から指定して1回で吐くのが速いです。さらに凝った帳票整形が必要なら、pandasでテーブルを出したあとにopenpyxlで整形を重ねると、速度と品質のバランスが取りやすくなります。


例題で身につける(定番から一歩先まで)

例題1:見出し固定・小数2桁でレポート出力

import pandas as pd

df = pd.DataFrame({"商品": ["コーヒー","紅茶"], "数量": [10,8], "単価": [350.0, 280.0]})
df["金額"] = df["数量"] * df["単価"]
df.to_excel("report.xlsx", index=False, float_format="%.2f", freeze_panes=(1, 0))
Python

例題2:複数シートへ同時出力(Writer)

import pandas as pd

sales = pd.DataFrame({"月":[1,2,3], "売上":[120,150,180]})
users = pd.DataFrame({"id":[101,102], "name":["Alice","Bob"]})

with pd.ExcelWriter("bundle.xlsx", engine="openpyxl") as w:
    sales.to_excel(w, sheet_name="Sales", index=False)
    users.to_excel(w, sheet_name="Users", index=False)
Python

例題3:既存ファイルのシートを置き換え

import pandas as pd

df = pd.DataFrame({"id":[1,2], "score":[90,80]})
with pd.ExcelWriter("existing.xlsx", engine="openpyxl", mode="a", if_sheet_exists="replace") as w:
    df.to_excel(w, sheet_name="Scores", index=False)
Python

例題4:開始位置をずらして表を配置

import pandas as pd

df = pd.DataFrame({"項目":["A","B","C"], "値":[1,2,3]})
df.to_excel("placed.xlsx", sheet_name="Data", startrow=3, startcol=2, index=False)
Python

まとめ

to_excelは「ファイル名・シート名・インデックス有無」を決めるだけで使えます。見やすさはna_rep(欠損)、float_format(小数桁)、freeze_panes(見出し固定)、startrow/startcol(配置)で整える。複数シートや既存への追記はExcelWriter+mode/if_sheet_existsが安全。リッチな書式やグラフはpandasで出力後にopenpyxl/xlsxwriterで仕上げると、短くて壊れないExcel出力が実務品質になります。

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