【问题标题】:Putting many python pandas dataframes to one excel worksheet将许多 python pandas 数据框放到一个 excel 工作表中
【发布时间】:2016-01-02 15:09:17
【问题描述】:

只要是不同的工作表,将许多 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) 

上面的代码不起作用。你会得到 ​​p> 的错误

 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) 

这会奏效。所以,我在 * 上发布这个问题的目的是双重的。首先,如果他/她试图将许多数据框放入 excel 的单个工作表中,我希望这会对某人有所帮助。

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

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

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

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

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

【问题讨论】:

    标签: python excel pandas dataframe xlsxwriter


    【解决方案1】:

    要提前创建工作表,需要将创建的工作表添加到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,它使用了作者的write_cells函数:

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

    所以查看write_cellsxlsxwriter 函数:

    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.sheets['Validation'] = worksheet,而不是sheet
    • 根据文档,不需要创建工作表。 xlsxwriter.readthedocs.io/example_pandas_multiple.html
    • @AdarshMadrecha 据我了解,将每个数据框放在不同的工作表上,而这个问题是关于将多个数据框放在同一个工作表中
    • 同意@Adrian
    【解决方案2】:

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

    【讨论】:

    • 不幸的是使用此代码我收到此错误:
    • AttributeError: 'unicode' 对象没有属性 'to_excel'
    • 你能帮帮我吗?谢谢
    • 优秀的帖子!正是我正在寻找的东西,然后是一些。 :)
    • @ManuelZompetta 你有最新版本的 Pandas 吗? 'to_excel' 应该可以工作 - pandas.pydata.org/pandas-docs/stable/generated/…
    【解决方案3】:

    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

    【讨论】:

    • 别忘了 writer.save()
    【解决方案4】:

    我更倾向于先连接数据框,然后将该数据框转换为 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)   
    

    【讨论】:

      最近更新 更多