Enregistrer la liste des DataFrames dans une feuille de calcul Excel multi-feuilles

89

Comment puis-je exporter une liste de DataFrames dans une seule feuille de calcul Excel?
La documentation pour l' to_excelétat:

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

Suite à 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, dont chacun peut enregistrer to_excelindividuellement), une exception est levée (Edit: traceback supprimé) :

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

Je suppose que je n'appelle pas ExcelWritercorrectement, comment dois-je être pour faire cela?

Andy Hayden
la source

Réponses:

135

Vous devriez utiliser la propre ExcelWriterclasse de pandas :

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

Ensuite, la save_xlsfonction 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()
Andy Hayden
la source
11
Comment trouvez-vous la vitesse de cela? J'ai essayé de faire la même chose hier et j'ai trouvé que l'écriture d'une trame de données avec 2000 colonnes dans un fichier .xlsx prenait environ 16s pour 100 lignes sur un poste de travail décent avec un lecteur à état solide. Un profilage rapide avec% prun dans ipython a montré que cela était dû au traitement XML. En fin de compte, j'ai obtenu les données dans Excel en passant par CSV car la vitesse d'ExcelWriter était excessivement lente.
2013
6
Toujours aussi lent en 2018.
stmax
2
Vous pouvez également l'utiliser ExcelWritercomme gestionnaire de contexte. with ExcelWriter(xls_path) as writer: df.to_excel(writer, sheet_name)
BallpointBen
2
Merci Andy. Pourriez-vous expliquer le 'sheet%s' % npeu s'il vous plaît? Que fait-il et comment ça marche?
Bowen Liu
2
@BowenLiu C'est juste nommer les feuilles de sheet1, sheet2, etc.
xiaomy
17

Au cas où quelqu'un aurait besoin d'un exemple de la façon de procéder avec un dictionnaire 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()

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

Marques Jared
la source
Cela m'a vraiment sauvé la journée. Mais il y a une chose que je ne comprends pas bien que cela ait fonctionné. Que fait la pièce '%s' % key? Voudriez-vous l'expliquer? Merci!
Bowen Liu
@BowenLiu qui prend la valeur de clé du dictionnaire et l'utilise pour le nom de la page dans la feuille Excel. '% s' est un espace réservé qui est rempli avec "clé". J'espère que ça t'as aidé.
Jared Marks le