web-dev-qa-db-fra.com

Enregistrer la liste des DataFrames dans une feuille de calcul Excel à plusieurs feuilles

Comment exporter une liste de DataFrames dans un seul tableur Excel?
Les documents pour to_Excel state:

Remarques
Si vous transmettez un objet ExcelWriter existant, la feuille sera ajoutée au classeur existant. Cela peut être utilisé pour enregistrer différents DataFrames dans un classeur

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

Après cela, j'ai pensé que je pourrais écrire une fonction qui enregistre une liste de DataFrames dans une feuille de calcul comme suit:

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

Cependant (avec une liste de deux petits DataFrames, chacun d'eux pouvant enregistrer to_Excel individuellement), une exception est déclenchée (Edit: traceback supprimé) :

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

Je n’appelle probablement pas ExcelWriter correctement, comment devrais-je être pour faire cela?

59
Andy Hayden

Vous devriez utiliser des pandas appartenant à la classe ExcelWriter:

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

Ensuite, la fonction save_xls fonctionne comme prévu:

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()
94
Andy Hayden

Au cas où quelqu'un aurait besoin d'un exemple sur la manière de procéder avec un dictionnaire de cadres de données

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, '%s' % key)

writer.save()

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

0
Jared Marks