Помещение множества кадровых фреймов python pandas на один рабочий лист excel

В базу данных excel довольно легко добавить много данных pandas, если это разные рабочие листы. Но несколько сложнее получить много данных в одном листе, если вы хотите использовать встроенную функциональность df.to_excel pandas.

# Creating Excel Writer Object from Pandas  
writer = pd.ExcelWriter('test.xlsx',engine='xlsxwriter')   
workbook=writer.book
worksheet=workbook.add_worksheet('Validation') 
df.to_excel(writer,sheet_name='Validation',startrow=0 , startcol=0)   
another_df.to_excel(writer,sheet_name='Validation',startrow=20, startcol=0) 

Приведенный выше код не будет работать. Вы получите сообщение об ошибке

 Sheetname 'Validation', with case ignored, is already in use.

Теперь я достаточно экспериментировал, что нашел способ заставить его работать.

writer = pd.ExcelWriter('test.xlsx',engine='xlsxwriter')   # Creating Excel Writer Object from Pandas  
workbook=writer.book
df.to_excel(writer,sheet_name='Validation',startrow=0 , startcol=0)   
another_df.to_excel(writer,sheet_name='Validation',startrow=20, startcol=0) 

Это сработает. Итак, моя цель размещения этого вопроса в stackoverflow двояка. Во-первых, я надеюсь, что это поможет кому-то, если он попытается поместить много данных в единый рабочий лист в excel.

Во-вторых, может ли кто-нибудь помочь мне понять разницу между этими двумя блоками кода? Мне кажется, что они почти такие же, за исключением первого блока кода, созданного листом, называемым "Validation" заранее, а второй - нет. Я получаю эту часть.

Я не понимаю, почему это должно быть иначе? Даже если я не создаю рабочий лист заранее, эта строка, строка прямо перед последней,

 df.to_excel(writer,sheet_name='Validation',startrow=0 , startcol=0)  

все равно создаст лист. Следовательно, к тому времени, когда мы достигли последней строки кода, рабочий лист "Validation" уже создан во втором блоке кода. Итак, мой вопрос в основном, почему второй блок кода работает, а первый - нет?

Пожалуйста, также сообщайте, есть ли другой способ поместить многие dataframes в excel, используя встроенную функциональность df.to_excel!

Ответы

Ответ 1

user3817518: "Пожалуйста, также сообщайте, есть ли другой способ поместить много данных в excel с помощью встроенной функции df.to_excel!"

Здесь моя попытка:

Простой способ собрать много данных на одном листе или на нескольких вкладках. Дайте мне знать, если это сработает!

- Чтобы проверить, просто запустите образцы данных и вторую и третью части кода.

Образцы данных

import pandas as pd
import numpy as np

# Sample dataframes    
randn = np.random.randn
df = pd.DataFrame(randn(15, 20))
df1 = pd.DataFrame(randn(10, 5))
df2 = pd.DataFrame(randn(5, 10))

Поместите несколько фреймов данных в один лист xlsx

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

# list of dataframes
dfs = [df,df1,df2]

# run function
multiple_dfs(dfs, 'Validation', 'test1.xlsx', 1)

Поместите несколько фреймов данных на отдельные вкладки/листы

# function
def dfs_tabs(df_list, sheet_list, file_name):
    writer = pd.ExcelWriter(file_name,engine='xlsxwriter')   
    for dataframe, sheet in zip(df_list, sheet_list):
        dataframe.to_excel(writer, sheet_name=sheet, startrow=0 , startcol=0)   
    writer.save()

# list of dataframes and sheet names
dfs = [df, df1, df2]
sheets = ['df','df1','df2']    

# run function
dfs_tabs(dfs, sheets, 'multi-test.xlsx')

Ответ 2

Чтобы создать рабочий лист заранее, вам нужно добавить созданный лист в sheets dict:

writer.sheets['Validation'] = worksheet

Использование исходного кода:

# Creating Excel Writer Object from Pandas  
writer = pd.ExcelWriter('test.xlsx',engine='xlsxwriter')   
workbook=writer.book
worksheet=workbook.add_worksheet('Validation')
writer.sheets['Validation'] = worksheet
df.to_excel(writer,sheet_name='Validation',startrow=0 , startcol=0)   
another_df.to_excel(writer,sheet_name='Validation',startrow=20, startcol=0) 

Описание

Если мы посмотрим на функцию pandas to_excel, она использует функцию writer write_cells:

excel_writer.write_cells(formatted_cells, sheet_name, startrow=startrow, startcol=startcol)

Итак, посмотрим на функцию write_cells для xlsxwriter:

def write_cells(self, cells, sheet_name=None, startrow=0, startcol=0):
    # Write the frame cells using xlsxwriter.
    sheet_name = self._get_sheet_name(sheet_name)
    if sheet_name in self.sheets:
        wks = self.sheets[sheet_name]
    else:
        wks = self.book.add_worksheet(sheet_name)
        self.sheets[sheet_name] = wks

Здесь мы видим, что он проверяет sheet_name на self.sheets, и поэтому его необходимо добавить туда.

Ответ 3

Я был бы более склонен сначала конкатенировать файлы данных, а затем превратить этот фреймворк в формат excel. Чтобы поместить два кадра данных вместе бок о бок (в отличие от одного над другим), выполните следующее:

writer = pd.ExcelWriter('test.xlsx',engine='xlsxwriter')   # Creating Excel Writer Object from Pandas  
workbook=writer.book
df.to_excel(writer,sheet_name='Validation',startrow=0 , startcol=0)   
new_df = pd.concat([df, another_df], axis=1)
new_df.to_excel(writer,sheet_name='Validation',startrow=0 , startcol=0)