Speichern Sie die Liste der DataFrames in einer Excel-Tabelle mit mehreren Blättern

89

Wie kann ich eine Liste von DataFrames in eine Excel-Tabelle exportieren?
Die Dokumente für den to_excelStatus:

Hinweise
Wenn Sie ein vorhandenes ExcelWriter-Objekt übergeben, wird das Blatt zur vorhandenen Arbeitsmappe hinzugefügt. Dies kann verwendet werden, um verschiedene DataFrames in einer Arbeitsmappe zu speichern

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

Im Anschluss daran dachte ich, ich könnte eine Funktion schreiben, die eine Liste von DataFrames wie folgt in einer Tabelle speichert:

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

Es wird jedoch (mit einer Liste von zwei kleinen DataFrames, von denen jeder to_exceleinzeln gespeichert werden kann ) eine Ausnahme ausgelöst (Bearbeiten: Traceback entfernt) :

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

Vermutlich rufe ich nicht ExcelWriterrichtig an, wie soll ich sein, um das zu tun?

Andy Hayden
quelle

Antworten:

134

Sie sollten Pandas eigene ExcelWriterKlasse verwenden:

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

Dann save_xlsfunktioniert die Funktion wie erwartet:

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
quelle
11
Wie finden Sie die Geschwindigkeit dafür? Ich habe gestern versucht, dasselbe zu tun, und festgestellt, dass das Schreiben eines Datenrahmens mit 2000 Spalten in eine XLSX-Datei auf einer anständigen Workstation mit Solid-State-Laufwerk etwa 16 Sekunden pro 100 Zeilen dauert. Einige schnelle Profilerstellungen mit% prun in ipython haben gezeigt, dass dies auf die XML-Verarbeitung zurückzuführen ist. Am Ende habe ich die Daten inte Excel über CSV erhalten, weil die ExcelWriter-Geschwindigkeit unerschwinglich langsam war.
snth
6
Noch so langsam im Jahr 2018.
stmax
2
Sie können auch ExcelWriterals Kontextmanager verwenden. with ExcelWriter(xls_path) as writer: df.to_excel(writer, sheet_name)
BallpointBen
2
Danke Andy. Würde es Ihnen 'sheet%s' % netwas ausmachen , das Bit bitte zu erklären ? Was macht es und wie funktioniert es?
Bowen Liu
2
@BowenLiu Das nennt nur die Blätter zu Blatt1, Blatt2 usw.
Xiaomy
17

Falls jemand ein Beispiel benötigt, wie dies mit einem Wörterbuch von Datenrahmen gemacht werden kann:

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

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

Jared Marks
quelle
Das hat mir wirklich den Tag gerettet. Aber eines verstehe ich nicht, obwohl es funktioniert hat. Was macht der Teil '%s' % key? Würde es Ihnen etwas ausmachen, es zu erklären? Vielen Dank!
Bowen Liu
@BowenLiu, das den Wörterbuchschlüsselwert verwendet und ihn für den Seitennamen in der Excel-Tabelle verwendet. '% s' ist ein Platzhalter, der mit "Schlüssel" ausgefüllt ist. Hoffentlich hilft das.
Jared Marks