Несколько раз сохранить несколько фреймов данных на несколько листов Excel? - PullRequest
1 голос
/ 08 мая 2019

У меня есть функция сохранения нескольких фреймов данных в виде нескольких таблиц на одном листе книги Excel:

def multiple_dfs(df_list, sheets, file_name, spaces):
    writer = pd.ExcelWriter(file_name,engine='xlsxwriter')   
    row = 0
    for dataframe in df_list:
        dataframe.to_excel(writer,sheet_name=sheets,startrow=row , startcol=0)   
        row = row + len(dataframe.index) + spaces + 1
    writer.save()

Если я вызову эту функцию несколько раз, чтобы записать несколько таблиц на несколько листов, я получу только одинРабочая тетрадь и один лист, который назывался последним:

multiple_dfs(dfs_gfk, 'GFK', 'file_of_tables.xlsx', 1)
multiple_dfs(dfs_top, 'TOP', 'file_of_tables.xlsx', 1)
multiple_dfs(dfs_all, 'Total', 'file_of_tables.xlsx', 1)

Итак, в итоге у меня есть только file_of_tables рабочая тетрадь только с Total листом.Я знаю, что это простая проблема, но почему-то я просто не могу придумать элегантного решения этой проблемы.Кто-нибудь может помочь?

Ответы [ 2 ]

2 голосов
/ 08 мая 2019

Получить writer внешнюю функцию с with:

def multiple_dfs(df_list, sheets, writer, spaces):
    row = 0
    for dataframe in df_list:
        dataframe.to_excel(writer,sheet_name=sheets,startrow=row , startcol=0)   
        row = row + len(dataframe.index) + spaces + 1
    writer.save()

with pd.ExcelWriter('file_of_tables.xlsx') as writer:
    multiple_dfs(dfs_gfk, 'GFK', writer, 1)
    multiple_dfs(dfs_top, 'TOP', writer, 1)
    multiple_dfs(dfs_all, 'Total', writer, 1)
0 голосов
/ 08 мая 2019

Из документации pandas.ExcelWriter :

You can also append to an existing Excel file:

>>> with ExcelWriter('path_to_file.xlsx', mode='a') as writer:
...     df.to_excel(writer, sheet_name='Sheet3')

Ключевое слово mode имеет значение при создании экземпляра класса ExcelWriter.

mode='w' выделяет место для файла (который он создает, когда вы вызываете .save() или .close()), когда его нет, или перезаписывает, если файл уже существует.

mode='a' предполагает, что файл существует, и добавляет к этому файлу. Если вы хотите сохранить структуру своего кода, вы должны добавить небольшую строку, например, так:

import pandas as pd
import os

def multiple_dfs(df_list, sheets, file_name, spaces):
    arg_mode = 'a' if file_name in os.getcwd() else 'w' # line added
    writer = pd.ExcelWriter(file_name, engine='xlsxwriter', mode=arg_mode) # added mode argument
    row = 0

    for dataframe in df_list:
        dataframe.to_excel(writer,sheet_name=sheets,startrow=row , startcol=0)   
        row = row + len(dataframe.index) + spaces + 1
    writer.save()

если вы затем запустите следующую серию кода (ов):

multiple_dfs(dfs_gfk, 'GFK', 'file_of_tables.xlsx', 1)
multiple_dfs(dfs_top, 'TOP', 'file_of_tables.xlsx', 1)
multiple_dfs(dfs_all, 'Total', 'file_of_tables.xlsx', 1)

последний (и второй вызов функции) не будет перезаписывать данные, записанные в данный момент. Вместо этого происходит то, что первый вызов функции создает файл, а затем второй и третий вызов функции добавляют к этим данным. Теперь ваша функция должна работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...