Salvar lista de DataFrames em planilha Excel multisheet

91

Como posso exportar uma lista de DataFrames para uma planilha do Excel?
Os documentos para o to_excelestado:

Observações
Se passar um objeto ExcelWriter existente, a planilha será adicionada à pasta de trabalho existente. Isso pode ser usado para salvar diferentes DataFrames em uma pasta de trabalho

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

Depois disso, pensei que poderia escrever uma função que salvasse uma lista de DataFrames em uma planilha da seguinte maneira:

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

No entanto (com uma lista de dois pequenos DataFrames, cada um dos quais pode ser salvo to_excelindividualmente), uma exceção é levantada (Editar: traceback removido) :

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

Presumivelmente, não estou ligando ExcelWritercorretamente. Como devo fazer para fazer isso?

Andy Hayden
fonte

Respostas:

138

Você deve usar a própria ExcelWriterclasse do pandas :

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

Então, a save_xlsfunção funciona conforme o esperado:

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
fonte
11
Como você está descobrindo a velocidade disso? Tentei fazer a mesma coisa ontem e descobri que gravar um dataframe com 2.000 colunas em um arquivo .xlsx estava demorando cerca de 16s por 100 linhas em uma estação de trabalho decente com unidade de estado sólido. Alguns perfis rápidos com% prun em ipython mostraram que isso se devia ao processamento XML. No final, obtive os dados inteiros do Excel usando CSV porque a velocidade do ExcelWriter era proibitivamente lenta.
dia
6
Ainda lento em 2018.
stmax
2
Você também pode usar ExcelWritercomo um gerenciador de contexto. with ExcelWriter(xls_path) as writer: df.to_excel(writer, sheet_name)
BallpointBen
2
Obrigado Andy. Você se importaria de explicar a parte, 'sheet%s' % npor favor? O que isso faz e como funciona?
Bowen Liu
2
@BowenLiu Isso é apenas nomear as folhas para
folha1
18

Caso alguém precise de um exemplo de como fazer isso com um dicionário de dataframes:

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

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

Jared Marks
fonte
Isso realmente salvou meu dia. Mas há uma coisa que não entendo, embora tenha funcionado. O que a parte '%s' % keyfaz? Você se importaria de explicar isso? Obrigado!
Bowen Liu
@BowenLiu que pega o valor da chave do dicionário e o usa para o nome da página na planilha do Excel. '% s' é um espaço reservado que é preenchido com "chave". Espero que ajude.
Jared Marks de
0

Às vezes, pode haver problemas (escrever um arquivo Excel contendo Unicode), se houver algum tipo de caractere não compatível no quadro de dados. Para superá-lo, podemos usar o pacote ' xlsxwriter ' como no caso abaixo:

para o código abaixo:

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

Recebi o erro como "IllegalCharacterError"

O código que funcionou:

%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
fonte