note.nkmk.me

pandasでExcelファイル(xlsx, xls)の書き込み(to_excel)

Date: 2018-05-06 / tags: Python, pandas, Excel
このエントリーをはてなブックマークに追加

pandas.DataFrameをExcelファイル(拡張子: .xlsx, .xls)として書き出すにはto_excel()メソッドを使う。

ここでは以下の内容について説明する。

  • xlwt, openpyxlのインストール
  • DataFrameをExcelファイルに書き込み(新規作成・上書き保存)
  • 複数のDataFrameをExcelファイルに書き込み(新規作成・上書き保存)
  • DataFrameを既存のExcelファイルに書き込み(追記)

Excelファイルの読み込みについては以下の記事を参照

PythonでのExcelファイルの扱いについては以下の記事を参照。

そのほかpandasでのcsvファイル、jsonファイルの読み書き(入出力)については以下の記事を参照。

スポンサーリンク

xlwt, openpyxlのインストール

to_excel()では内部でxlwt, openpyxlというライブラリを使っている。

xlwtは.xlsファイル(Excel2003までのフォーマット)の書き込み、openpyxlは.xlsx(Excel2007以降のフォーマット)の書き込みに使われる。

どちらもはpipでインストールできる。(環境によってはpip3

$ pip install xlwt
$ pip install openpyxl

DataFrameをExcelファイルに書き込み(新規作成・上書き保存)

以下のpandas.DataFrameを例とする。openpyxlのインポートは最後に説明する既存のExcelファイルに追記する場合に必要。

import pandas as pd
import openpyxl

df = pd.DataFrame([[11, 21, 31], [12, 22, 32], [31, 32, 33]],
                  index=['one', 'two', 'three'], columns=['a', 'b', 'c'])

print(df)
#         a   b   c
# one    11  21  31
# two    12  22  32
# three  31  32  33

to_excel()メソッドの第一引数にパスを指定すると、ファイルが存在しない場合は新規作成、ファイルが存在している場合は上書き保存される。上書きの際は元のファイルのデータが削除されるので注意。

引数sheet_nameにはシート名を指定する。省略するとSheet1という名前になる。

df.to_excel('data/dst/pandas_to_excel.xlsx', sheet_name='new_sheet_name')

index(行名), columns(列名)を書き出す必要がない場合は、引数index, columnsFalseとする。

df.to_excel('data/dst/pandas_to_excel_no_index_header.xlsx', index=False, header=False)

複数のDataFrameをExcelファイルに書き込み(新規作成・上書き保存)

ExcelWriterオブジェクトを使うと、複数のpandas.DataFrameオブジェクトを別々のシートに書き出すことが可能。

例としてpandas.DataFrameオブジェクトをもう一つ用意する。

df2 = df[['a', 'c']]
print(df2)
#         a   c
# one    11  31
# two    12  32
# three  31  33

pandas.ExcelWriter()関数にパスを指定してExcelWriterオブジェクトを生成し、to_excel()メソッドの第一引数に指定する。

withブロックを使うとwriter.save(), writer.close()を呼ぶ必要がない。

with pd.ExcelWriter('data/dst/pandas_to_excel_multi.xlsx') as writer:
    df.to_excel(writer, sheet_name='sheet1')
    df2.to_excel(writer, sheet_name='sheet2')

DataFrameを既存のExcelファイルに書き込み(追記)

ExcelWriterオブジェクトのbook属性にopenpyxlで読み込んだWorkbookオブジェクトを指定すると、既存のExcelファイルの新たなシートとしてpandas.DataFrameを追加することができる。

openpyxlを使った処理なので.xlsxファイルのみが対象。

path = 'data/dst/pandas_to_excel.xlsx'

with pd.ExcelWriter(path) as writer:
    writer.book = openpyxl.load_workbook(path)
    df.to_excel(writer, sheet_name='new_sheet1')
    df2.to_excel(writer, sheet_name='new_sheet2')

なお、新たなシートを追加するのではなく、既存のExcelファイルのシートの書式を保ったまま編集・追記(セルの値の変更、新たなセルの追加など)したい場合はopenpyxlで直接操作するのが便利。以下の記事を参照。

スポンサーリンク
シェア
このエントリーをはてなブックマークに追加

関連カテゴリー

関連記事