pandas
のDataFrame
, Series
は、.to_excel()
メソッドで簡単にExcelに出力できます。
しかし、実際に出力しようとすると、次のような問題に直面することも…
- 出力ブックやシート、セルの指定方法は?
- 既存Excelに書き込むことはできる?
- 欠損値の扱いってどうなるの?
そこで、この記事では.to_excel()
について、次の内容について解説していきます。
- Excelの保存先・書き込み方法の設定
ExcelWriter
を使用した上書き以外の保存方法
- 出力シート、セルの指定
- 表の見出しの設定
- 出力内容の変更(出力列指定、欠損値、無限大、小数点桁数の出力設定)
- DataFrameのExcel出力基本
- to_excel基本設定一覧
- 保存先Excelの指定
- 出力シート・セル
- 見出しの設定
- 出力内容の設定
- PythonでのExcel操作
- オススメ|pandasとデータ分析の勉強方法
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()
メソッドは表形式での書き出しに便利なメソッドです。
表形式ではなく、セルごとにエクセルを使いたい場合は、openpyxl
かxlwings
を使いましょう。
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の操作には、openpyxl
やxlwings
も便利ですね。
出力シート・セル
出力先のシート、セルの指定方法について順番に解説していきます。
シート名の指定
出力先ソート名は、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
のインデックス名 → 行見出し
以下では、ヘッダーに関連して次の内容について解説します。
- ヘッダーの出力有無指定
- ヘッダー内容の変更
- ヘッダーの書式オフ
インデックスが上手に設定できていない方は、次の記事を参考にしてみてください。
ヘッダーの出力有無
デフォルトでは、ヘッダー・行見出し両方とも出力されます。
それぞれ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="ひにち")
次のようにヘッダーを変更できています。
- 【参考】インデックスそのものの操作については、次の記事で解説しています。
ヘッダーの書式オフ
デフォルトでは、ヘッダー、インデックス列が太字、枠線ありに設定されます。
自動スタイル設定をオフにするには、次のように設定します。
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
- 【参考】時系列データの操作については、次の記事で紹介しています。
出力列の指定
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
で出力されています。
- 【参考】欠損値の処理そのものについては、次の記事で紹介しています。
無限大の出力値
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
の機能だけで十分です。
しかし、PythonでExcelを自由に操作したい場合には、openpyxl
やxlwings
の方が便利です。
次の記事もチェックしてみてください。
オススメ|pandasとデータ分析の勉強方法
今回は、pandas
のDataFrame
をExcelに出力する方法について解説しました。
pandas
は便利すぎて操作方法がわかりにくいことがよくあります…。
結局はコツコツ学ぶのが、pandas
マスターの近道ですよね!
データ分析初心者の方にはこちらの記事もおススメです。
私がこれまで勉強してきた経験をもとに考えたおススメの勉強本の紹介記事です。
何から始めて、どうやってレベルアップしていけばいいのか、初心者の方にぜひおススメしたい本を紹介しました。
オススメのpandas
本については、次の記事で紹介しています。