Збережіть список DataFrames у табличній таблиці Excel


89

Як я можу експортувати список DataFrames в одну електронну таблицю Excel?
Документи для to_excelштату:

Примітки.
Якщо передавати існуючий об’єкт ExcelWriter, аркуш буде доданий до існуючої книги. Це можна використовувати для збереження різних фреймів даних в одній книзі

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

Після цього я подумав, що можу написати функцію, яка зберігає список DataFrames в одній таблиці наступним чином:

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

Однак (зі списком двох невеликих фреймів даних, кожен з яких може зберігати to_excelокремо), висувається виняток (Редагувати: трасування назад видалено) :

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

Імовірно, я не дзвоню ExcelWriterправильно, як мені бути, щоб це зробити?

Відповіді:


135

Ви повинні використовувати власний ExcelWriterклас панд :

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

Тоді save_xlsфункція працює як слід:

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
Як ви знаходите швидкість цього? Я спробував зробити те саме вчора і виявив, що запис кадру даних з 2000 стовпцями у файл .xlsx займає близько 16 секунд на 100 рядків на пристойній робочій станції з твердотільним накопичувачем. Деякі швидкі профілі із% prun в ipython показали, що це пов’язано з обробкою XML. Врешті-решт я отримав дані в Excel, перейшовши через CSV, оскільки швидкість ExcelWriter була надмірно низькою.
snth

6
У 2018 році все так само повільно
stmax,

2
Ви також можете використовувати ExcelWriterяк менеджер контексту. with ExcelWriter(xls_path) as writer: df.to_excel(writer, sheet_name)
BallpointBen

2
Дякую Енді. Ви не заперечуєте , пояснюючи 'sheet%s' % nтрохи , будь ласка? Що робить і як працює?
Боуен Лю

2
@BowenLiu Це просто присвоєння імен аркушам листу1, аркушу2 тощо
xiaomy

17

Якщо комусь потрібен приклад того, як це зробити за допомогою словника фреймів даних:

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

приклад: save_xls(dict_df = my_dict, path = '~/my_path.xls')


Це справді врятувало мій день. Але є одне, чого я не розумію, хоча це спрацювало. Що робить частина '%s' % key? Не могли б ви це пояснити? Дякую!
Боуен Лю

@BowenLiu, який приймає значення ключа словника та використовує його для назви сторінки на аркуші Excel. "% s" - заповнювач, заповнений "ключем". Сподіваюся, це допомагає.
Джаред Маркс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.