Simpan daftar DataFrames ke lembar kerja Excel multisheet

90

Bagaimana cara mengekspor daftar DataFrames menjadi satu spreadsheet Excel?
Dokumen untuk to_excelnegara bagian:

Catatan
Jika melewatkan objek ExcelWriter yang ada, maka lembar tersebut akan ditambahkan ke buku kerja yang sudah ada. Ini bisa digunakan untuk menyimpan DataFrames yang berbeda ke satu buku kerja

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

Setelah ini, saya pikir saya bisa menulis fungsi yang menyimpan daftar DataFrames ke satu spreadsheet sebagai berikut:

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()

Namun (dengan daftar dua DataFrames kecil, yang masing-masing dapat disimpan satu to_excelper satu), pengecualian dimunculkan (Edit: traceback dihapus) :

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

Agaknya saya tidak menelepon ExcelWriterdengan benar, bagaimana seharusnya saya melakukan ini?

Andy Hayden
sumber

Jawaban:

137

Anda harus menggunakan ExcelWriterkelas pandas sendiri :

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

Kemudian save_xlsfungsinya bekerja seperti yang diharapkan:

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()
Andy Hayden
sumber
11
Bagaimana Anda menemukan kecepatan ini? Saya mencoba melakukan hal yang sama kemarin dan menemukan bahwa menulis dataframe dengan 2000 kolom ke file .xlsx membutuhkan waktu sekitar 16 detik per 100 baris pada workstation yang layak dengan solid state drive. Beberapa pembuatan profil cepat dengan% prun di ipython menunjukkan hal ini disebabkan oleh pemrosesan XML. Pada akhirnya saya mendapatkan data di Excel dengan melalui CSV karena kecepatan ExcelWriter sangat lambat.
snth
6
Masih lambat di 2018.
stmax
2
Anda juga dapat menggunakan ExcelWritersebagai pengelola konteks. with ExcelWriter(xls_path) as writer: df.to_excel(writer, sheet_name)
BallpointBen
2
Terima kasih Andy. Maukah Anda menjelaskan 'sheet%s' % nsedikit? Apa fungsinya dan bagaimana cara kerjanya?
Bowen Liu
2
@BowenLiu Itu hanya menamai sheet menjadi sheet1, sheet2, dll.
xiaomy
18

Jika ada yang membutuhkan contoh bagaimana melakukan ini dengan kamus kerangka data:

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()

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

Jared Marks
sumber
Ini benar-benar menyelamatkan hariku. Tetapi ada satu hal yang saya tidak mengerti meskipun berhasil. Apa bagian '%s' % keyitu? Maukah Anda menjelaskannya? Terima kasih!
Bowen Liu
@BowenLiu yang mengambil nilai kunci kamus, dan menggunakannya untuk nama halaman di lembar excel. '% s' adalah placeholder yang diisi dengan "key". Semoga membantu.
Jared Marks
0

Terkadang ada masalah (Menulis file excel yang berisi unicode), jika ada beberapa tipe karakter non pendukung dalam bingkai data. Untuk mengatasinya kita bisa menggunakan paket ' xlsxwriter ' seperti pada kasus di bawah ini:

untuk kode di bawah ini:

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()

Saya mendapatkan error sebagai "IllegalCharacterError"

Kode yang berfungsi:

%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()
Anil Kumar
sumber