将许多 python pandas 数据框放入一个 excel 工作表
Putting many python pandas dataframes to one excel worksheet
将许多pandas数据帧添加到excel工作簿中非常容易,只要它是不同的工作sheet。但是,如果您想使用 pandas 内置的 df.to_excel 功能,那么将多个数据帧整合到一个作品中有点棘手 sheet。
# 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)
这行得通。所以,我在 Whosebug 上发布这个问题的目的是双重的。首先,如果 he/she 试图将许多数据帧放入 excel 的单个作品 sheet 中,我希望这会对某人有所帮助。
其次,有人可以帮助我理解这两段代码之间的区别吗?在我看来,它们几乎相同,除了第一块代码创建工作 sheet 提前调用 "Validation" 而第二块没有。我明白了。
我不明白的是为什么它会有所不同?即使我不提前创作作品sheet,这一行,最后一行的前一行,
df.to_excel(writer,sheet_name='Validation',startrow=0 , startcol=0)
无论如何都会创作作品sheet。因此,当我们到达最后一行代码时,worksheet "Validation" 也已经在第二个代码块中创建。所以,我的问题基本上是,为什么第二段代码可以工作而第一段代码却不能?
如果有另一种方法可以使用内置的 df.to_excel 功能将许多数据帧放入 excel,也请分享!!
user3817518:"Please also share if there is another way to put many dataframes into excel using the built-in df.to_excel functionality !!"
这是我的尝试:
将大量数据框放在一个 sheet 或跨多个选项卡上的简单方法。让我知道这是否有效!
-- 要进行测试,只需 运行 示例数据帧以及代码的第二部分和第三部分。
示例数据帧
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 sheet
# 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)
将多个数据帧放在单独的 tabs/sheets
中
# 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')
我更倾向于先连接数据帧,然后将该数据帧转换为 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)
要提前创建作品sheet,需要将创建的sheet添加到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
在这里我们可以看到它在 self.sheets
中检查 sheet_name
,因此也需要将其添加到那里。
阿德里安的回答可以简化如下
writer = pd.ExcelWriter('test.xlsx',engine='xlsxwriter')<br>
df.to_excel(writer,sheet_name='Validation',startrow=0 , startcol=0)<br>
another_df.to_excel(writer,sheet_name='Validation',startrow=20,startcol=0)
适用于 pandas 0.25.3
和 python 3.7.6
使用 with
- 您不必显式调用 writer.save()
或 writer.close()
。
此外,如果您使用 workbook=writer.book
,它会自动管理 workbook.close()
。
(其他答案忘了这样做,这种情况经常发生,因为我们是人类;)
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)
结果:
将许多pandas数据帧添加到excel工作簿中非常容易,只要它是不同的工作sheet。但是,如果您想使用 pandas 内置的 df.to_excel 功能,那么将多个数据帧整合到一个作品中有点棘手 sheet。
# 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)
这行得通。所以,我在 Whosebug 上发布这个问题的目的是双重的。首先,如果 he/she 试图将许多数据帧放入 excel 的单个作品 sheet 中,我希望这会对某人有所帮助。
其次,有人可以帮助我理解这两段代码之间的区别吗?在我看来,它们几乎相同,除了第一块代码创建工作 sheet 提前调用 "Validation" 而第二块没有。我明白了。
我不明白的是为什么它会有所不同?即使我不提前创作作品sheet,这一行,最后一行的前一行,
df.to_excel(writer,sheet_name='Validation',startrow=0 , startcol=0)
无论如何都会创作作品sheet。因此,当我们到达最后一行代码时,worksheet "Validation" 也已经在第二个代码块中创建。所以,我的问题基本上是,为什么第二段代码可以工作而第一段代码却不能?
如果有另一种方法可以使用内置的 df.to_excel 功能将许多数据帧放入 excel,也请分享!!
user3817518:"Please also share if there is another way to put many dataframes into excel using the built-in df.to_excel functionality !!"
这是我的尝试:
将大量数据框放在一个 sheet 或跨多个选项卡上的简单方法。让我知道这是否有效!
-- 要进行测试,只需 运行 示例数据帧以及代码的第二部分和第三部分。
示例数据帧
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 sheet
# 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)
将多个数据帧放在单独的 tabs/sheets
中# 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')
我更倾向于先连接数据帧,然后将该数据帧转换为 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)
要提前创建作品sheet,需要将创建的sheet添加到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
在这里我们可以看到它在 self.sheets
中检查 sheet_name
,因此也需要将其添加到那里。
阿德里安的回答可以简化如下
writer = pd.ExcelWriter('test.xlsx',engine='xlsxwriter')<br>
df.to_excel(writer,sheet_name='Validation',startrow=0 , startcol=0)<br>
another_df.to_excel(writer,sheet_name='Validation',startrow=20,startcol=0)
适用于 pandas 0.25.3
和 python 3.7.6
使用 with
- 您不必显式调用 writer.save()
或 writer.close()
。
此外,如果您使用 workbook=writer.book
,它会自动管理 workbook.close()
。
(其他答案忘了这样做,这种情况经常发生,因为我们是人类;)
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)
结果: