使用python中的pandas将数据写入现有Excel

时间:2019-09-11 18:52:28

标签: python excel pandas dataframe openpyxl

当前,我正在将两个数据帧导出到单个excel文件中。每个数据框放置在单独的页面上。我目前正在运行模拟,每个数据框需要2,000列(每张纸上需要2,000列)。每次我运行代码时,它都会创建一个新的excel文件(本来是我想要的)。但是为了节省时间,我想知道是否可以通过添加新的数据列而不覆盖现有数据来写入现有的excel文件?

######### This is my original code ################
import pandas as pd
from pandas import ExcelWriter
from pandas import ExcelFile
from pandas import DataFrame
from openpyxl import Workbook

df1 = pd.DataFrame(returns1)
df2 = pd.DataFrame(returns2)


x1 = 'mypath/ '
x2 = datetime.datetime.now().strftime('%B %d, %Y %H-%M-%S')
x3 = '.xlsx'
destination = x1 + x2 + x3
writer = pd.ExcelWriter(destination, engine='xlsxwriter')

df1.to_excel(writer, sheet_name= 'Returns 1', index=False)
df2.to_excel(writer, sheet_name= 'Returns 2', index=False)
writer.save()
### 更新

代码有效!谢谢大家的帮助,尤其是@zhqiat。下面是最终代码。正是我想要的。我希望这会帮助遇到我同样问题的其他人。

df1 = pd.DataFrame(returns1)
df2 = pd.DataFrame(returns2)

book = load_workbook('mypath.xlsx')
writer = pd.ExcelWriter('mypath.xlsx', engine='openpyxl')
writer.book = book
writer.sheets = {ws.title: ws for ws in book.worksheets}

df1.to_excel(writer, sheet_name='Returns1', startrow=0, startcol=writer.sheets['Returns1'].max_column, index=False)
df2.to_excel(writer, sheet_name='Returns2', startrow=0, startcol=writer.sheets['Returns2'].max_column, index=False)

This is what I wanted.
 A
100
120
119
225

Second Time
 A     B
100    98
120   100
119   105
125   111

Third Time
 A     B     C
100    98    106 
120   100    99
119   105    101
125   111    89

以此类推...

2 个答案:

答案 0 :(得分:0)

不幸的是,追加到excel并不是熊猫的完整功能。

对于一起被黑客入侵的解决方案,您可以使用excel writer对象将工作表缝合在一起。

听起来您想为所有新数据添加列(而不是行),所以您可能需要使用

确定电子表格的宽度

maxcol = writer.sheets['SheetName'].max_column

**编辑,我不好,是max_column而不是max_col **

有关如何添加行的完整代码,请参考prior question from 2017

答案 1 :(得分:0)

读取excel文件并将其存储为数据框,然后附加系列并将其写入相同的excel工作表

# read wherever you have stored the file

prev_df = pd.read_excel('path to file.xlsx')

# convert new series to df
new_df =  pd.DataFrame(var1)

# join
df_to_write = prev_df.join(new_df)

# write to excel