2017-02-21 36 views
10

我想用excel文件來存儲用python闡述的數據。我的問題是我無法將工作表添加到現有的Excel文件中。在這裏我建議一個示例代碼,以便與工作分別達到這個問題如何使用Pandas在現有的Excel文件中保存新工作表?

import pandas as pd 
import numpy as np 

path = r"C:\Users\fedel\Desktop\excelData\PhD_data.xlsx" 

x1 = np.random.randn(100, 2) 
df1 = pd.DataFrame(x1) 

x2 = np.random.randn(100, 2) 
df2 = pd.DataFrame(x2) 

writer = pd.ExcelWriter(path, engine = 'xlsxwriter') 
df1.to_excel(writer, sheet_name = 'x1') 
df2.to_excel(writer, sheet_name = 'x2') 
writer.save() 
writer.close() 

該代碼可以節省2個DataFrames到兩片,名爲「X1」和「X2」。如果我創建兩個新的DataFrame並嘗試使用相同的代碼添加兩個新工作表'x3'和'x4',則原始數據將丟失。

import pandas as pd 
import numpy as np 

path = r"C:\Users\fedel\Desktop\excelData\PhD_data.xlsx" 

x3 = np.random.randn(100, 2) 
df3 = pd.DataFrame(x3) 

x4 = np.random.randn(100, 2) 
df4 = pd.DataFrame(x4) 

writer = pd.ExcelWriter(path, engine = 'xlsxwriter') 
df3.to_excel(writer, sheet_name = 'x3') 
df4.to_excel(writer, sheet_name = 'x4') 
writer.save() 
writer.close() 

我想要一個帶有四張表格的excel文件:'x1','x2','x3','x4'。 我知道'xlsxwriter'不是唯一的「引擎」,有'openpyxl'。我也看到已經有其他人寫過關於這個問題的文章,但我還是不明白該怎麼做。

這裏從這個link

import pandas 
from openpyxl import load_workbook 

book = load_workbook('Masterfile.xlsx') 
writer = pandas.ExcelWriter('Masterfile.xlsx', engine='openpyxl') 
writer.book = book 
writer.sheets = dict((ws.title, ws) for ws in book.worksheets) 

data_filtered.to_excel(writer, "Main", cols=['Diff1', 'Diff2']) 

writer.save() 

採取了代碼,他們說,它的工作原理,但它是很難弄清楚如何。我不明白「ws.title」,「ws」和「dict」在這種情況下。

保存「x1」和「x2」,然後關閉文件,再次打開並添加「x3」和「x4」的最佳方法是什麼?

回答

9

謝謝。我認爲,一個完整的例子可以很好的爲別人有一些問題:

import pandas as pd 
import numpy as np 

path = r"C:\Users\fedel\Desktop\excelData\PhD_data.xlsx" 

x1 = np.random.randn(100, 2) 
df1 = pd.DataFrame(x1) 

x2 = np.random.randn(100, 2) 
df2 = pd.DataFrame(x2) 

writer = pd.ExcelWriter(path, engine = 'xlsxwriter') 
df1.to_excel(writer, sheet_name = 'x1') 
df2.to_excel(writer, sheet_name = 'x2') 
writer.save() 
writer.close() 

在這裏,我產生一個Excel文件,從我的理解它並沒有真正不論是通過「xslxwriter」或產生「openpyxl」引擎。

當我想沒有失去原來的數據,那麼

import pandas as pd 
import numpy as np 
from openpyxl import load_workbook 

path = r"C:\Users\fedel\Desktop\excelData\PhD_data.xlsx" 

book = load_workbook(path) 
writer = pd.ExcelWriter(path, engine = 'openpyxl') 
writer.book = book 

x3 = np.random.randn(100, 2) 
df3 = pd.DataFrame(x3) 

x4 = np.random.randn(100, 2) 
df4 = pd.DataFrame(x4) 

df3.to_excel(writer, sheet_name = 'x3') 
df4.to_excel(writer, sheet_name = 'x4') 
writer.save() 
writer.close() 

這個代碼寫的做的工作!

6

在您共享的示例中,您將現有文件加載到book中,並將writer.book值設置爲book。在行writer.sheets = dict((ws.title, ws) for ws in book.worksheets)中,您正在訪問工作簿中的每張工作表ws。表格標題爲ws,因此您正在創建{sheet_titles: sheet}鍵值對的字典。這個字典然後被設置爲writer.sheets。 實質上,這些步驟只是加載'Masterfile.xlsx'中的現有數據並使用它們填充作者。

現在我們假設您已經有一個x1x2作爲工作表。你可以使用示例代碼來加載文件,然後可以做這樣的事情來添加和x4

path = r"C:\Users\fedel\Desktop\excelData\PhD_data.xlsx" 
writer = pd.ExcelWriter(path, engine='openpyxl') 
df3.to_excel(writer, 'x3', index=False) 
df4.to_excel(writer, 'x4', index=False) 
writer.save() 

這應該做你正在尋找的東西。

5

我強烈建議您直接使用openpyxl since it now supports Pandas DataFrames

這使您可以專注於相關的Excel和Pandas代碼。

+0

如果你可以添加一些類似於[this]的「Pandas」示例,這將非常有用(http://xlsxwriter.readthedocs.io/working_with_pandas.html) – MaxU

+0

我並沒有對熊貓做很多工作我自己,所以我不能提供這麼多的例子,但會歡迎文檔的改進。 –

3

一個簡單的例子,用於一次寫入多個數據。另外,當你想將數據追加到寫入的excel文件(關閉的excel文件)的表單上時。

這是您第一次寫入excel。 (編寫「DF1」和「DF2」到「1st_sheet」和「2nd_sheet」)

import pandas as pd 
from openpyxl import load_workbook 

df1 = pd.DataFrame([[1],[1]], columns=['a']) 
df2 = pd.DataFrame([[2],[2]], columns=['b']) 
df3 = pd.DataFrame([[3],[3]], columns=['c']) 

excel_dir = "my/excel/dir" 

with pd.ExcelWriter(excel_dir, engine='xlsxwriter') as writer:  
    df1.to_excel(writer, '1st_sheet') 
    df2.to_excel(writer, '2nd_sheet') 
    writer.save()  

在您關閉您的Excel,但你希望在同爲「追加」 excel數據文件,但另一張紙,讓我們說「df3」爲表名「3rd_sheet」。

book = load_workbook(excel_dir) 
with pd.ExcelWriter(excel_dir, engine='openpyxl') as writer: 
    writer.book = book 
    writer.sheets = dict((ws.title, ws) for ws in book.worksheets)  

    ## Your dataframe to append. 
    df3.to_excel(writer, '3rd_sheet') 

    writer.save()  

請注意,excel格式不能是xls,您可以使用xlsx之一。

+1

我沒有看到這個答案增加了什麼。事實上,像這樣重複使用上下文管理器會涉及更多的I/O。 –

+1

只是我個人的意見,寫一個書面/封閉的Excel文件的新表格上的數據。 –

相關問題