迭代多个Dataframe并写入excel中的excel电子表格xlsxwriter python

时间:2017-03-17 13:52:31

标签: python excel pandas spreadsheet xlsxwriter

我正在excel文件中的excel电子表格中编写多个数据帧。 数据帧使用for循环生成,因此在每次迭代中我都会获得下一个可用的数据帧,但我无法在电子表格中编写每个数据帧。 我只能在第一个电子表格中编写第一个数据帧。 以下是代码段:

 writer = pd.ExcelWriter('output.xlsx', engine='xlsxwriter')
    workbook = writer.book
    web_ClassID=df_stag["Web-Class ID"].unique()
          for data_id, df in df_stag.groupby('Web-Class ID'): 
             for workbook_Id in web_ClassID:
                 if workbook_Id == data_id:
                    for index, col in enumerate(df):
                    df.to_excel(writer,sheet_name=workbook_Id,index=False )
                    writer.save()
    workbook.close()

注意: 这里的webclass_id是对象的类型 Df_stag:是一个按Webclass_id分组的数据框 df是我要写入excel电子表格的数据框 此外,每当找到新的Webclass_id时,我都会创建电子表格,因此在找到时会使用相应的Webclass_id创建标签。One file having few tabs another file having few tabs

输出:我想要一个excel文件,其中包含来自所有文件的所有选项卡以及来自这些文件的附加数据,这两个文件中都有相同的选项卡。即。 11111,22222,33333和来自11111的数据应来自两个文件。

4 个答案:

答案 0 :(得分:2)

只需将writer.save()移到for循环之外:

writer = pd.ExcelWriter('output.xlsx', engine='xlsxwriter')
workbook = writer.book
web_ClassID=df_stag["Web-Class ID"].unique()

for data_id, df in df_stag.groupby('Web-Class ID'):
    for workbook_Id in web_ClassID:
        if workbook_Id == data_id:
            for index, col in enumerate(df):
                df.to_excel(writer,sheet_name=workbook_Id,index=False )
writer.save()
workbook.close()

对于更短的代码,只需迭代过滤而不需要工作簿对象:

writer = pd.ExcelWriter('output.xlsx')
for d in df_stag["Web-Class ID"].unique():    
    df_stag[df_stag["Web-Class ID"]==d].to_excel(writer, sheet_name=d, index=False)        

writer.save()

答案 1 :(得分:1)

使用XlsxWriter绝对可以将多个数据帧写入单独的工作表或同一工作表中的不同位置。

请参阅XlsxWriter文档的Handling multiple Pandas Dataframes部分或示例herehere

如果它不适用于您的情况,那么我猜:

  1. workbook_Id并不是唯一的,而且您正在覆盖相同的工作表。
  2. workbook_Id == data_id只有一次。
  3. 你有一些旧版本的Pandas或XlsxWriter。
  4. 我将从1.和2.开始,然后输入一些调试语句。

答案 2 :(得分:0)

我终于找到了回答我的问题!!

我只需将对象分配给sheet_name属性,它就会自动将每个dataframe实例复制到工作表名为workbook_Id的excel表中。即。 df.to_excel(作家,SHEET_NAME = workbook_Id)

答案 3 :(得分:0)

@Parfait:早些时候我的代码创建了新的Excel工作表,但它没有复制excel工作表中的dataframe实例。 我只将工作表名称作为网络类ID。

即使我枚举了df并尝试在excel表中写入df。它只是编写第一个数据帧的内容

for index, col in enumerate(df):
                df.to_excel(writer,sheet_name=workbook_Id,index=False )
writer.save()

将workbook_id分配给sheet_name不会创建新工作表并在sheet_name中分配内容。

df.to_excel(writer,sheet_name=workbook_Id)

另外,我发现不需要明确写出writer.save。即使我们在迭代to_excel()之后编写了workbook.close(),它也会写入并保存数据。