YutaKaのPython教室

Python の文法やライブラリ、API、環境構築について画像・動画・ソースコード付きで徹底解説!

Pandas DataFrameをExcelに出力|to_excelわかりやすい解説

pandasDataFrame, Seriesは、.to_excel()メソッドで簡単にExcelに出力できます。

しかし、実際に出力しようとすると、次のような問題に直面することも…

  • 出力ブックやシート、セルの指定方法は?
  • 既存Excelに書き込むことはできる?
  • 欠損値の扱いってどうなるの?

そこで、この記事では.to_excel()について、次の内容について解説していきます。

  • Excelの保存先・書き込み方法の設定
    • ExcelWriterを使用した上書き以外の保存方法
  • 出力シート、セルの指定
  • 表の見出しの設定
  • 出力内容の変更(出力列指定、欠損値、無限大、小数点桁数の出力設定)

DataFrameのExcel出力基本

最も基本的な方法は、.to_excel()メソッドにファイル名(or ファイルのパス)を渡す方法です。

  • df.to_excel("ファイル名.xlsx") → 作業フォルダに保存
  • df.to_excel("ファイルパス") → ファイルパスの場所に保存

簡単なサンプルデータで挙動を確認してみましょう。

import pandas as pd

data = [["Sunny", 24],
       ["Rainy", 25]]

df = pd.DataFrame(data,
                  index=pd.Index(pd.date_range("2020/4/1", freq="D", periods=2), name="Date"),
                  columns=pd.Index(["Weather", "Temp"]))
df
#            Weather  Temp
# Date                    
# 2020-04-01   Sunny    24
# 2020-04-02   Rainy    25

さっそく、ファイル名を指定して、DataFrameをExcelに出力してみましょう。

df.to_excel("my_dataframe.xlsx")

次のように作業フォルダにExcelファイルが生成されました。

.to_excel("ファイル名.xlsx")のデフォルト挙動は下記の通りです。

  • "ファイル名.xlsx"のExcelファイルを新規に作成
    • 同名の既存ファイルがある場合は上書き
  • A1セルから始まる表を出力
    • ヘッダーとインデックスは太字・枠有

最も注意が必要な点は、初期設定では同名ファイルがあっても上書き保存される点です。

いきなり.to_excel()を実行して、大事な既存ファイルを上書きしないように注意しましょう。

また、.to_excel()メソッドは表形式での書き出しに便利なメソッドです。

表形式ではなく、セルごとにエクセルを使いたい場合は、openpyxlxlwingsを使いましょう。

≫openpyxl | pythonでExcelを操作する方法徹底「図解」!
openpyxlを使用すると、PythonでExcelを操作することができます。openpyxlでブック、シート、セルを操作する方法について図解付きで徹底解説しています!
www.yutaka-note.com/entry/openpyxl
 
≫【図解!】xlwingsの使い方 | pythonでExcelを操作①アクティブブックの操作編
xlwingsを使用すると、Excelを開きながら、PythonでExcelを操作することができます。今回は、特にインタラクティブな操作感が強いアクティブシートの操作を図解・サンプルコード付きで紹介します。
www.yutaka-note.com/entry/xlwings_active
 

 

to_excel基本設定一覧

.to_excel()の主要引数は次の通りです。

設定内容 引数 コメント
保存先Excelの指定 excel_writer="ファイル名など" excel_writer=は省略可能
● ファイル名
● フォルダパス
ExcelWriterオブジェクト
sheet_name="シート名" デフォルト:"Sheet1"  
列番号 startrow=列番号 0から始まる数値で指定
● A列 → 0
行番号 startcol=行番号 0から始まる数値で指定
● 1行目 → 0
ヘッダー出力 header=True or False True:カラム名出力(デフォルト)
False:カラム名なし
インデックス列出力 index=True or False True:インデックス列出力(デフォルト)
False:インデックス列なし
ヘッダーの変更 header=["ヘッダー名"のリスト] 指定しないと、カラム名出力
インデックス名変更 index_label="インデックス名" インデックス列のタイトル部分
出力列の指定 columns=["出力列名"のリスト] 指定しないと、全列を出力
欠損値の出力内容 na_rep="欠損値の出力内容" デフォルト:""(空文字)
無限大の出力内容 inf_rep="無限大の出力内容" デフォルト:"inf"
小数点の出力桁数 float_format="桁数指定の文字列" ex) 123.456の出力
● デフォルト -> 123.456
"%.2f"123.46 
"%.1f"123.5

各設定内容について、詳しく解説していきます。

保存先Excelの指定

.to_excel()メソッドにファイル名(またはファイルのパス)を渡すと、DataFrameを新規のExcelファイルとして保存できます。

  • df.to_excel("ファイル名.xlsx") → 作業フォルダに保存
  • df.to_excel("ファイルパス") → ファイルパスの場所に保存

指定した名前のExcelファイルが既に存在する場合には、上書き保存されます。

ファイル名を指定して実行した場合の挙動を確認してみましょう。

# ファイル名の指定
df.to_excel("my_dataframe.xlsx")

# ファイルパスの指定
# df.to_excel("C:\\~省略~\\my_dataframe.xlsx")

次のように、作業フォルダにExcelファイルが保存されます。

作業フォルダの確認方法

Pythonを始めたばかりで作業フォルダがよくわからない方のために、作業フォルダの確認方法も紹介します。

  • 作業フォルダ確認|os. getcwd()

テンプレは下記の通りです。

import os
os. getcwd()
# 'C:\\作業フォルダのパス'

既存Excelへの書き込み|ExcelWriter

既存のExcelファイルへの書き込みをする際には、ExcelWriterオブジェクトを使用します。

  • ExcelWriterオブジェクト:Excelへの書き込み方法を指定するオブジェクト

既存シートに書き込みする場合は、ExcelWriter生成時に、次の3つの引数を設定します。

設定内容 引数(既存シートへの書き込み) その他の設定内容一覧
エンジン指定 enine="openpyxl" "xlsxwriter" → 書き込み専用
"openpyxl" → 読み書き可能
ファイルの開き方 mode="a" "w" → 書き込み専用
"a" → 読み書き可能
既存シートがある際の処理 if_sheet_exists="overlay" "error" → エラーを起こす
"new" → 別名の新規シートを作成
"replace" → 既存シートを削除して新規作成
"overlay" → 既存シートに書き込み

ファイル処理のエラーに対応できるように、with文と組み合わせて使用することが多いです。

with pd.ExcelWriter("既存エクセル.xlsx", engine="openpyxl", mode="a", if_sheet_exists="overlay") as writer:
    df.to_excel(writer, sheet_name="既存シート")

例えば、次の画像のように既存シートに書き込みが可能になります。

古いバージョンではうまくいかないことがあるので、その場合はpandasのバージョンを最新にして試してみてください。

何度もDataFrameを出力する場合は、ExcelWriterの引数を辞書にしておくと便利ですね。

writer_spec = {"path":"既存エクセル.xlsx",
               "engine":"openpyxl",
               "mode":"a",
               "if_sheet_exists":"overlay"}

with pd.ExcelWriter(**writer_spec) as writer:
    df.to_excel(writer, sheet_name="既存シート")    

デフォルトでは、ヘッダーの太字、枠線が設定されます。

これもオフにしたい場合は、後述の「ヘッダーの書式オフ」を参考にしてください。

既存Excelの操作には、openpyxlxlwingsも便利ですね。

≫openpyxl | pythonでExcelを操作する方法徹底「図解」!
openpyxlを使用すると、PythonでExcelを操作することができます。openpyxlでブック、シート、セルを操作する方法について図解付きで徹底解説しています!
www.yutaka-note.com/entry/openpyxl
 
≫【図解!】xlwingsの使い方 | pythonでExcelを操作①アクティブブックの操作編
xlwingsを使用すると、Excelを開きながら、PythonでExcelを操作することができます。今回は、特にインタラクティブな操作感が強いアクティブシートの操作を図解・サンプルコード付きで紹介します。
www.yutaka-note.com/entry/xlwings_active
 

出力シート・セル

出力先のシート、セルの指定方法について順番に解説していきます。

シート名の指定

出力先ソート名は、sheet_nameで指定します。

  • sheet_name="シート名"
df.to_excel("my_dataframe.xlsx", sheet_name="Wether_record")

次のようにシート名が指定値に変更されています。

他にも前述の既存Excelの既存シートへの書き込みの際にも、sheet_nameでシート名を指定していましたね。

書き出しセルの指定

デフォルトでは、DataFrameの左上がA1セルに一致するように書き出されます。

startrow, startcolを指定すると、DataFrameの書き出しセルを変更することができます。

  • 行番号:startrow(デフォルト:0
  • 列番号:startcol(デフォルト:0

※Excelの行番号、列名と異なり、0から始まる数値で指定する点に注意が必要です。

サンプルコードで実行例を確認してみましょう。

df.to_excel("my_dataframe.xlsx", startrow=2, startcol=1)

見出しの設定

デフォルトでは、DataFrameのラベル名がそのままヘッダーとして出力されます。

  • DataFrameのカラム名 → ヘッダー(列見出し)
  • DataFrameのインデックス名 → 行見出し

以下では、ヘッダーに関連して次の内容について解説します。

  • ヘッダーの出力有無指定
  • ヘッダー内容の変更
  • ヘッダーの書式オフ

インデックスが上手に設定できていない方は、次の記事を参考にしてみてください。

≫pandas インデックス列の基本操作|要素にアクセス、検索、欠損値処理
pandasのDataFrameでは、インデックス列の操作方法に関して、網羅的に解説!①インデックスの基本構造②インデックス内要素へのアクセス方法③インデックス内のデータ検索、並べ替え、重複処理、欠損値処理。サンプルコード付きでわかりやすく解説!
www.yutaka-note.com/entry/pandas_index_manip
 

ヘッダーの出力有無

デフォルトでは、ヘッダー・行見出し両方とも出力されます。

それぞれheader, index引数で出力有無を変更できます。

  • ヘッダーなし:header=False
  • 行見出しなし:index=False

デフォルトがTrueなので、何も指定しないと両方とも出力されます。

ヘッダー、行見出しを出力しない例を確認してみましょう。

df.to_excel("my_dataframe.xlsx", header=False, index=False)

次のようにヘッダー・行見出しがない状態で出力されます。

出力先のセルは、DataFrameのデータ部分の左上が基準となります。

ヘッダーの変更

ヘッダーを変更した場合は、別途指定することが可能です。

  • ヘッダーの変更:header=[ヘッダーのリスト]
  • 行見出し名の変更:index_label=行見出し名

サンプルデータで挙動を確認してみましょう。

df.to_excel("my_dataframe.xlsx", header=["天気", "気温"], index_label="ひにち")

次のようにヘッダーを変更できています。

  • 【参考】インデックスそのものの操作については、次の記事で解説しています。
≫pandas インデックス列の基本操作|要素にアクセス、検索、欠損値処理
pandasのDataFrameでは、インデックス列の操作方法に関して、網羅的に解説!①インデックスの基本構造②インデックス内要素へのアクセス方法③インデックス内のデータ検索、並べ替え、重複処理、欠損値処理。サンプルコード付きでわかりやすく解説!
www.yutaka-note.com/entry/pandas_index_manip
 

ヘッダーの書式オフ

デフォルトでは、ヘッダー、インデックス列が太字、枠線ありに設定されます。

自動スタイル設定をオフにするには、次のように設定します。

  • pd.io.formats.excel.ExcelFormatter.header_style = None
pd.io.formats.excel.ExcelFormatter.header_style = None
df.to_excel("my_dataframe.xlsx")

次のようにヘッダー、インデックス列に書式が設定されなくなります。

pandasのバージョンによっては、設定内容が異なりますので、設定が反映されない場合は次のフォーラムを確認してみてください。

出力内容の設定

出力内容の設定について、以下の項目を解説していきます。

  • 出力列の指定
  • 欠損値の出力値
  • 無限大の出力値
  • 小数点の桁数

挙動確認用にサンプルデータに、次のデータ列を追加しておきましょう。

import datetime
df.loc[datetime.datetime(2020, 4, 3)] = ["Cloudy", None]
df["Val"] = [1.234, 98.765, float("inf")]
df
#            Weather  Temp     Val
# Date                            
# 2020-04-01   Sunny    24   1.234
# 2020-04-02   Rainy    25  98.765
# 2020-04-03  Cloudy  None     inf
  • 【参考】時系列データの操作については、次の記事で紹介しています。
≫pandas 文字列⇒Datetime変換|時系列操作を簡単マスター!
pandasで"文字列"をDatetimeに変換する方法、Datetimeの基本的な操作方法を解説します。"文字列"のままでは、日時関連の計算や条件判定が自由にできません…。Datetimeに変換して、日付の差分計算や便利な機能を使えるようにしましょう!
www.yutaka-note.com/entry/pandas_datetime
 

出力列の指定

columnsで、ラベル名を指定すると出力する列を指定することができます。

  • columns=[出力する列のカラム名]

出力の順番も指定した順番になります。

例として、"Temp"列と"Val"列のみを出力してみます。

df.to_excel("my_dataframe.xlsx", columns=["Val", "Temp"])

指定した"Temp"列と"Val"列のみが、指定順で出力されます。

DataFrameの列数が多い時に、出力内容を限定、順番を整理したい場合に便利ですね。

欠損値の出力値

デフォルトでは、欠損値は空文字としてExcelに出力されます。

欠損値内容を指定する場合は、引数na_repで指定します。

  • na_rep="欠損値内容"

Excelのエラー値, #N/Aを使用したい場合は、次のように"=NA()"を指定すればOKです。

  • na_rep="=NA()"
df.to_excel("my_dataframe.xlsx", na_rep="=NA()")

次のように、欠損値が#N/Aで出力されています。

  • 【参考】欠損値の処理そのものについては、次の記事で紹介しています。
≫pandas 欠損値NaN処理一覧|抽出、除去、補間
pandasを使用すると欠損値NaNを効率的かつ高速に処理することができます。① NaNのある行や列を抽出する方法は?② NaNのある行や列を削除したい!③ NaNを他の値で置き換えたり、線形補間したりするにはどうするの?こんな悩みをサンプルコート付きでわかりやすく解決します!
www.yutaka-note.com/entry/pandas_na
 

無限大の出力値

Excelには無限大を表す特殊な表現はありません。

デフォルトでは、単に"inf"という文字列で出力されます。

無限大の内容を指定する場合は、引数inf_repで指定します。

  • inf_rep="無限大の出力値"
df.to_excel("my_dataframe.xlsx", inf_rep="無限大")

次のように、無限大の内容が変更されています。

小数点の出力桁数

デフォルトでは、DataFrameの小数点が可能な範囲で細かく出力されます。

これを小数点数ケタまでの出力に限定する場合は、float_formatに次のような%書式指定子を渡します。

  • 小数点2ケタ:float_format="%.2f"
  • 小数点4ケタ:float_format="%.4f"

小数点2ケタの例を見てみましょう。

df.to_excel("my_dataframe.xlsx", float_format="%.2f")

次のように小数点2ケタで出力されます。

フォーマットだけでなく、出力値自体が小数点2ケタになっている点にも注意してください。

PythonでのExcel操作

今回は、.to_excel()DataFrameを表形式でExcelに出力する方法を紹介しました。

逆にExcelやCSVからデータを読み込むは、pd.read_excel()pd.read_csv()を使用します。

≫pandas | read_excel() 図解でわかりやすく解説!
pandasで、excelファイルを読み込むための関数read_excel()について、図解で徹底解説!①表のデータがセルA1から始まっていないときの対応方法②indexやlabelの行や列を指定する方法
www.yutaka-note.com/entry/pandas_read_excel_1
 
≫pandas | read_csv() 図解でわかりやすく解説!
pandasでcsvファイルを読み込むための関数read_csv()について、図解で徹底解説! ①区切り文字の指定②indexやlabelの行や列を指定する方法③読み込む行・列の指定など細かい設定についての解説記事です!
www.yutaka-note.com/entry/pandas_read_csv
 

表形式の入出力だけであれば、上記のpandasの機能だけで十分です。

しかし、PythonでExcelを自由に操作したい場合には、openpyxlxlwingsの方が便利です。

次の記事もチェックしてみてください。

≫openpyxl | pythonでExcelを操作する方法徹底「図解」!
openpyxlを使用すると、PythonでExcelを操作することができます。openpyxlでブック、シート、セルを操作する方法について図解付きで徹底解説しています!
www.yutaka-note.com/entry/openpyxl
 
≫【図解!】xlwingsの使い方 | pythonでExcelを操作①アクティブブックの操作編
xlwingsを使用すると、Excelを開きながら、PythonでExcelを操作することができます。今回は、特にインタラクティブな操作感が強いアクティブシートの操作を図解・サンプルコード付きで紹介します。
www.yutaka-note.com/entry/xlwings_active
 

オススメ|pandasとデータ分析の勉強方法

今回は、pandasDataFrameをExcelに出力する方法について解説しました。

pandasは便利すぎて操作方法がわかりにくいことがよくあります…。

結局はコツコツ学ぶのが、pandasマスターの近道ですよね!

≫【ブログカテゴリー:pandas】

データ分析初心者の方にはこちらの記事もおススメです。

私がこれまで勉強してきた経験をもとに考えたおススメの勉強本の紹介記事です。

何から始めて、どうやってレベルアップしていけばいいのか、初心者の方にぜひおススメしたい本を紹介しました。

≫独学でデータ分析を勉強するオススメ学習本
独学でのpythonデータ分析勉強に役立ったおススメ書籍を紹介していきます。業務でそれなりにデータ分析を行えるまで、いろいろな試行錯誤をしてきましたが、もし自分が今ゼロから勉強する立場ならどうするのがいいのか考えてみました。以下では、入門書、個別モジュール用、実践用の3つの視点でおススメ本を紹介していきます。
www.yutaka-note.com/entry/data_analysis
 

オススメのpandas本については、次の記事で紹介しています。

≫【レビュー】「Python実践データ分析100本ノック」|100本終えたらpandasが好きになっていた
Python実践データ分析100本ノックで、実際に100本終了したレビューです。pythonでのデータ分析の入門書としてかなりの良書だったと思います。・python2~3冊目に何を勉強しようか迷っている人・時間をかけずにデータ分析の基本を学びたい人・pandasへの抵抗を減らしたい人
www.yutaka-note.com/entry/nock_100
 
≫【レビュー】「Pythonによるデータ分析入門」| pandas開発者によるpandasユーザーのためのpandasの教科書!
「Pythonによるデータ分析入門」を、最初から最後まで実際に実践してみたレビューです。具体的にどのようなことができるようになったかを実例付きで紹介します!・DataFrameの生成方法・欠損値の処理方法・グラフ化の方法気になる学習時間は…?
www.yutaka-note.com/entry/2019/12/07/230219