簡體   English   中英

將 Pandas 數據框導出到 Excel 多表文件的正確方法是什么?

[英]What is the right way to export Pandas dataframe to Excel multi-sheet file?

我需要將兩個經過清理和重新計算的數據幀作為單獨的工作表輸出到 Excel 文件中。 這段代碼有效,但在 Excel 中打開生成的文件會產生“文件損壞”——它被修復並在之后打開正常,但這很煩人。

代碼在 Azure Jupiter Notebook、Python 3.6 上,我下載 Excel 文件並在 Excel 365、Win 10 中打開。

# Create a Pandas Excel writer using XlsxWriter as the engine.
writer = pd.ExcelWriter('PR_weatherGDDid.xlsx', engine='xlsxwriter') 

# Write each dataframe to a different worksheet.
df.to_excel(writer, sheet_name='Daily', index=False)     
doystats.to_excel(writer, sheet_name='stats')    

# Close the Pandas Excel writer and output the Excel file.
writer.save()

所以:Excel 文件已創建,但在 Excel 中打開時出現問題。

這是正確的方法。

>>> with pd.ExcelWriter('PR_weatherGDDid.xlsx') as writer: 
...     df.to_excel(writer, sheet_name='Daily')
...     doystats.to_excel(writer, sheet_name='stats')

這是我的代碼,我可以正常打開 Excell 文件:

# Create a Pandas Excel writer using XlsxWriter as the engine.
writer = pd.ExcelWriter('PR_weatherGDDid.xlsx') 

data = [['AMN987','Ok'],['AMN987','Ok'],['AMN987','Error'], ['BBB987','Ok'],['BBB987','Ok'],['CCC','Error']]
df = pd.DataFrame(data, columns=['Serial', 'Status'])

days_to = [['02/08/19',4],['02/08/19',8],['02/08/19',3], ['02/08/19',6],['02/08/19',0],['02/08/19',9]]
doystats = pd.DataFrame(days_to, columns=['Date', 'Day'])

# Write each dataframe to a different worksheet.
df.to_excel(writer, sheet_name='Daily', index=False)     
doystats.to_excel(writer, sheet_name='stats')    

# Close the Pandas Excel writer and output the Excel file.
writer.save()
writer.close()

輸出如下所示:

在此處輸入圖片說明 在此處輸入圖片說明

Excel 只在“修復”后打開創建的文件的問題似乎源於文件是在 Azure Jupiter notebook 在線創建的。 所有 3 個代碼變體(我的並由 @atlas 和 @sharif 建議)在在線環境中生成了需要“修復”的文件,但是當我通過本地安裝的 Jupiter Notebooks (Anaconda) 運行它時生成了普通的 Excel 文件。

正如 Larisa Golovko 指出的那樣,這似乎只是 Azure Notebooks 上的 XlsxWriter 的問題。 離線環境中的 XlsxWriter、Pandas 或 Jupyter 不會發生這種情況。

在這里深入研究了一點,看起來 xlsx 存檔中的 .rels 文件存在 zipfile 壓縮錯誤。 目前我不知道是什么原因造成的,但它似乎與該環境中的標准 Python zipfile 庫有關。 我將嘗試在沒有 XlsxWriter 的情況下組合一個更簡單的測試用例。

解決方法是使用 XlsxWriter in_memory構造函數選項:

workbook = xlsxwriter.Workbook('hello_world.xlsx', {'in_memory': True})

# Or:

writer = pd.ExcelWriter('pandas_example.xlsx',
                        engine='xlsxwriter',
                        options={'in_memory': True})

暫無
暫無

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

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