簡體   English   中英

將許多 python pandas 數據框放到一個 excel 工作表中

[英]Putting many python pandas dataframes to one excel worksheet

只要是不同的工作表,將許多熊貓數據框添加到 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 中,也請分享!

要提前創建工作表,您需要將創建的工作表添加到工作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 ,它使用了 writer 的write_cells函數:

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

因此,查看xlsxwriterwrite_cells函數:

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因此也需要將其添加到那里。

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

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)

適用於帶有 python 3.7.6的 pandas 0.25.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)   

使用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) 

結果:

在此處輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM