Salva l'elenco di DataFrame in un foglio di calcolo Excel a più fogli


91

Come posso esportare un elenco di DataFrame in un foglio di calcolo Excel?
I documenti per lo to_excelstato:

Note
Se si passa un oggetto ExcelWriter esistente, il foglio verrà aggiunto alla cartella di lavoro esistente. Può essere utilizzato per salvare diversi DataFrame in una cartella di lavoro

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

In seguito, ho pensato di poter scrivere una funzione che salva un elenco di DataFrame su un foglio di calcolo come segue:

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

Tuttavia (con un elenco di due piccoli DataFrame, ognuno dei quali può essere salvato to_excelindividualmente), viene sollevata un'eccezione (Modifica: traceback rimosso) :

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

Presumibilmente non sto chiamando ExcelWritercorrettamente, come dovrei essere per farlo?

Risposte:


138

Dovresti usare la ExcelWriterclasse dei panda :

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

Quindi la save_xlsfunzione funziona come previsto:

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
Come stai trovando la velocità di questo? Ho provato a fare la stessa cosa ieri e ho scoperto che scrivere un dataframe con 2000 colonne in un file .xlsx richiedeva circa 16 secondi per 100 righe su una workstation decente con unità a stato solido. Alcuni rapidi profili con% prun in ipython hanno mostrato che ciò è dovuto all'elaborazione XML. Alla fine ho ottenuto i dati inte Excel andando via CSV perché la velocità di ExcelWriter era proibitivamente lenta.
snth

6
Ancora lento nel 2018.
stmax

2
Puoi anche usarlo ExcelWritercome gestore di contesto. with ExcelWriter(xls_path) as writer: df.to_excel(writer, sheet_name)
Ballpoint

2
Grazie Andy. Ti dispiacerebbe spiegare il 'sheet%s' % nbit per favore? Cosa fa e come funziona?
Bowen Liu

2
@BowenLiu Questo è solo il nome dei fogli a foglio1, foglio2, ecc.
xiaomy

18

Nel caso qualcuno abbia bisogno di un esempio di come farlo con un dizionario di dataframe:

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

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


Questo mi ha davvero salvato la giornata. Ma c'è una cosa che non capisco anche se ha funzionato. Cosa fa la parte '%s' % key? Ti dispiacerebbe spiegarlo? Grazie!
Bowen Liu

@BowenLiu che prende il valore della chiave del dizionario e lo utilizza per il nome della pagina nel foglio Excel. '% s' è un segnaposto riempito con "chiave". Spero possa aiutare.
Jared Marks

0

A volte ci possono essere problemi (Scrivere un file excel contenente unicode), se ci sono alcuni tipi di caratteri non di supporto nel frame di dati. Per superarlo possiamo usare il pacchetto ' xlsxwriter ' come nel caso seguente:

per il codice sottostante:

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

Ho ricevuto l'errore "IllegalCharacterError"

Il codice che ha funzionato:

%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()
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.