DataFrameのリストをマルチシートExcelスプレッドシートに保存します


90

DataFrameのリストを1つのExcelスプレッドシートにエクスポートするにはどうすればよいですか?状態
のドキュメントto_excel


既存のExcelWriterオブジェクトを渡すと、シートが既存のブックに追加されます。これを使用して、さまざまなデータフレームを1つのブックに保存できます

writer = ExcelWriter('output.xlsx')
df1.to_excel(writer, 'sheet1')
df2.to_excel(writer, 'sheet2')
writer.save()

これに続いて、次のようにDataFrameのリストを1つのスプレッドシートに保存する関数を作成できると思いました。

from openpyxl.writer.excel import ExcelWriter
def save_xls(list_dfs, xls_path):
    writer = ExcelWriter(xls_path)
    for n, df in enumerate(list_dfs):
        df.to_excel(writer,'sheet%s' % n)
    writer.save()

ただし(それぞれがto_excel個別に保存できる2つの小さなDataFrameのリストを使用)、例外が発生します(編集:トレースバックが削除されました)

AttributeError: 'str' object has no attribute 'worksheets'

おそらく私はExcelWriter正しく電話をかけていませんが、これを行うにはどうすればよいですか?

回答:


137

パンダ独自のExcelWriterクラスを使用する必要があります。

from pandas import ExcelWriter
# from pandas.io.parsers import ExcelWriter

次に、save_xls関数は期待どおりに機能します。

def save_xls(list_dfs, xls_path):
    with ExcelWriter(xls_path) as writer:
        for n, df in enumerate(list_dfs):
            df.to_excel(writer,'sheet%s' % n)
        writer.save()

11
これの速度をどのように見つけていますか?昨日同じことをしようとしましたが、2000列のデータフレームを.xlsxファイルに書き込むには、ソリッドステートドライブを備えた適切なワークステーションで100行あたり約16秒かかることがわかりました。ipythonでの%prunを使用したいくつかのクイックプロファイリングは、これがXML処理によるものであることを示しました。結局、ExcelWriterの速度が非常に遅いため、CSV経由でExcelにデータを取得しました。
snth 2013年

6
2018年もまだ遅い
。– stmax

2
ExcelWriterコンテキストマネージャーとしても使用できます。with ExcelWriter(xls_path) as writer: df.to_excel(writer, sheet_name)
BallpointBen

2
アンディに感謝します。'sheet%s' % n少し説明していただけませんか。それは何をし、どのように機能しますか?
ボーエン劉

2
@BowenLiuこれは、シートにsheet1、sheet2などの名前を付けるだけです。
xiaomy19年

18

データフレームの辞書を使用してこれを行う方法の例が必要な場合:

from pandas import ExcelWriter

def save_xls(dict_df, path):
"""
Save a dictionary of dataframes to an excel file, with each dataframe as a seperate page
"""

    writer = ExcelWriter(path)
    for key in dict_df:
        dict_df[key].to_excel(writer, key)

    writer.save()

例: save_xls(dict_df = my_dict, path = '~/my_path.xls')


これは本当に私の一日を救った。しかし、うまくいったのに理解できないことが1つあります。その部分'%s' % keyは何をしますか?説明していただけませんか。ありがとう!
ボーエン劉

辞書のキー値を取得し、Excelシートのページ名に使用する@BowenLiu。'%s'は、「キー」で埋められるプレースホルダーです。お役に立てば幸いです。
ジャレドマークス

0

データフレームにサポートされていない文字タイプがある場合、問題が発生することがあります(Unicodeを含むExcelファイルの書き込み)。それを克服するために、以下の場合のように ' xlsxwriter 'パッケージを使用できます。

以下のコードの場合:

from pandas import ExcelWriter
import xlsxwriter
writer = ExcelWriter('notes.xlsx')
for key in dict_df:
        data[key].to_excel(writer, key,index=False)
writer.save()

「IllegalCharacterError」としてエラーが発生しました

機能したコード:

%pip install xlsxwriter
from pandas import ExcelWriter
import xlsxwriter
writer = ExcelWriter('notes.xlsx')
for key in dict_df:
        data[key].to_excel(writer, key,index=False,engine='xlsxwriter')
writer.save()
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.