将许多 python pandas 数据框放入一个 Excel 工作表中

问题描述 投票:0回答:6

只要是不同的工作表,就可以很容易地将多个 pandas 数据框添加到 Excel 工作簿中。但是,如果您想使用 pandas 内置的 df.to_excel 功能,将许多数据帧放入一个工作表中有点棘手。

# 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 的单个工作表中的人有所帮助。

其次,有人可以帮助我理解这两个代码块之间的区别吗?在我看来,它们几乎是相同的,除了第一个代码块提前创建了名为“验证”的工作表,而第二个代码块则没有。我明白那部分。

我不明白的是为什么它应该有所不同?即使我没有提前创建工作表,这一行,最后一行之前的行,

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

无论如何都会创建一个工作表。因此,当我们到达最后一行代码时,工作表“验证”也已经在第二个代码块中创建。所以,我的问题基本上是,为什么第二个代码块可以工作,而第一个代码块却不能?

如果有其他方法可以使用内置的 df.to_excel 功能将许多数据帧放入 Excel 中,也请分享!

python excel pandas dataframe xlsxwriter
6个回答
77
投票

要提前创建工作表,您需要将创建的工作表添加到

sheets
字典中:

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
,它使用了作者的
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
,因此也需要添加到那里。


71
投票

user3817518:“如果有其他方法可以使用内置的 df.to_excel 功能将许多数据帧放入 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')

10
投票

Adrian 的答案可以简化如下

writer = pd.ExcelWriter('test.xlsx',engine='xlsxwriter')
df.to_excel(writer,sheet_name='Validation',startrow=0 , startcol=0)
another_df.to_excel(writer,sheet_name='Validation',startrow=20, startcol=0)

适用于 pandas

0.25.3
与 python
3.7.6


6
投票

使用

with
- 您不必显式调用
writer.save()
writer.close()

此外,如果您使用

workbook.close()
,它会自动管理
workbook=writer.book

(其他答案忘记这样做,这种情况经常发生,因为我们是人类;)

import pandas as pd 

df = pd.DataFrame(data={'col1':[9,3,4,5,1,1,1,1], 'col2':[6,7,8,9,5,5,5,5]}) 
df2 = pd.DataFrame(data={'col1':[25,35,45,55,65,75], 'col2':[61,71,81,91,21,31]}) 

with pd.ExcelWriter('test.xlsx', engine='xlsxwriter') as writer:
    df.to_excel(writer, sheet_name='testSheetJ', startrow=1, startcol=0)
    df2.to_excel(writer, sheet_name='testSheetJ', startrow=1+len(df)+3, startcol=0) 

结果:


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)   

0
投票

将多个数据帧写入单个 Excel 工作表

# Position the dataframes in the worksheet.
df1.to_excel(writer, sheet_name='Sheet1')  # Default position, cell A1.
df2.to_excel(writer, sheet_name='Sheet1', startcol=3)
df3.to_excel(writer, sheet_name='Sheet1', startrow=6)

# Write the dataframe without the header and index.
df4.to_excel(writer, sheet_name='Sheet1',startrow=7, startcol=4, header=False, index=False)
© www.soinside.com 2019 - 2024. All rights reserved.