2017-02-21 377 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文件的新表格上的数据。 –

相关问题