使用Pandas将DataFrame追加到Excel中

17

我想将数据框附加到Excel中。

这段代码几乎符合我的要求。虽然它没有每次都追加数据。我运行它并将数据框放入Excel中。但每次运行它时,它不会追加数据。我还听说openpyxl需要很高的CPU资源,但是没有听说有很多解决方法workarounds

import pandas
from openpyxl import load_workbook

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

df1.to_excel(writer, index = False)

writer.save()

我希望每次运行时数据都能够添加,但事实并非如此。

数据输出与原始数据相同:

A   B   C
H   H   H

我希望第二次运行后实现

A   B    C
H   H    H
H   H    H

如果这很显然,那我很抱歉,因为我是新手,练习的例子并没有按照我的期望工作。

问题是 - 每次运行时如何添加数据。我尝试改用xlsxwriter但遇到 AttributeError:'Workbook'对象没有'add_format'属性错误。

7个回答

46

首先,这篇文章是解决方案的第一部分,您应该在其中指定 startrow=使用Python Pandas将新数据帧附加到现有的Excel工作表

您还可以考虑使用 header=False。 因此它应该看起来像:

df1.to_excel(writer, startrow = 2,index = False, Header = False)
``` 如果希望数据自动添加到表格末尾,请使用以下代码: ```
startrow = writer.sheets['Sheet1'].max_row

如果你希望它遍历工作簿中的所有表格:

for sheetname in writer.sheets:
    df1.to_excel(writer,sheet_name=sheetname, startrow=writer.sheets[sheetname].max_row, index = False,header= False)

顺便说一下,对于writer.sheets,你可以使用字典推导式(我认为这样更简洁,但这取决于你,它产生相同的输出):

writer.sheets = {ws.title: ws for ws in book.worksheets}

完整的代码如下:

import pandas
from openpyxl import load_workbook

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

for sheetname in writer.sheets:
    df1.to_excel(writer,sheet_name=sheetname, startrow=writer.sheets[sheetname].max_row, index = False,header= False)

writer.save()

这在Python 2的pandas 0.24.2中对我有效(当我尝试时,也适用于0.19.2)。 - P A N
在 max_row 行,工作表名称对我抛出了一个错误。 - vanetoj

11

您可以使用append_df_to_excel()帮助函数,该函数在此答案中定义:

使用示例:

filename = r'C:\OCC.xlsx'

append_df_to_excel(filename, df)

append_df_to_excel(filename, df, header=None, index=False)

append_df_to_excel(filename, df, sheet_name='Sheet2', index=False)

append_df_to_excel(filename, df, sheet_name='Sheet2', index=False, startrow=25)

1
这是一个非常有用的函数,直到昨天都能完美运行。现在使用此辅助函数时,我遇到了一个错误“值必须是序列”。有任何想法为什么会出现这种情况吗? - ncraig

10

这里的所有示例都相当复杂。 在文档中,更加简单明了:

def append_to_excel(fpath, df, sheet_name):
    with pd.ExcelWriter(fpath, mode="a") as f:
        df.to_excel(f, sheet_name=sheet_name)

append_to_excel(<your_excel_path>, <new_df>, <new_sheet_name>)

当在LibreOffice/OpenOffice的Excel文件上使用时,我会遇到以下错误:

KeyError: "There is no item named 'xl/drawings/drawing1.xml' in the archive"

正如这里所提到的,这是openpyxl中的一个bug。


2
这将新的DF附加到一个新的工作表。 - Julio S.
1
@JulioS。这将一个新的df追加到现有的Excel文件作为新工作表。 - Gwang-Jin Kim
1
您还可以进行叠加。请参见 https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.ExcelWriter.html#pandas.ExcelWriter - Wtower
ValueError: 不支持使用xlsxwriter的追加模式! - Aqua 4

7

我试图读取一个Excel文件,将其放入数据框中,然后将来自Excel的数据框与所需的数据框连接起来。这对我有效。

def append_df_to_excel(df, excel_path):
    df_excel = pd.read_excel(excel_path)
    result = pd.concat([df_excel, df], ignore_index=True)
    result.to_excel(excel_path, index=False)

df = pd.DataFrame({"a":[11,22,33], "b":[55,66,77]})
append_df_to_excel(df, r"<path_to_dir>\<out_name>.xlsx")

pf.concat正是我正在寻找的东西。简单而有效。干得好,Victor。 - Westly White
完美的答案:太简单了!谢谢! - Thomas Tiotto
这将删除我的现有Sheet1。 - john k

1
如果有人需要,我找到了一种更简单的方法:
将DF转换为列表中的行
rows = your_df.values.tolist()
加载您的工作簿
workbook = load_workbook(filename=your_excel)
选择你的表格
sheet = workbook[your_sheet]
迭代行以附加每个行:
for row in rows:
    sheet.append(row)
完成后保存工作簿
workbook.save(filename=your_excel)
将所有内容整合起来:
rows = your_df.values.tolist()
workbook = load_workbook(filename=your_excel)
sheet = workbook[your_sheet]
for row in rows:
    sheet.append(row)
workbook.save(filename=your_excel)

0
为什么要把事情复杂化呢? 只需获取Excel文件中的行数来确定使用startrow参数的追加位置即可:
import pandas as pd
import openpyxl as xl

# Get number of rows in excel file (to determine where to append)
source_file = xl.load_workbook("file.xlsx", enumerate)
sheet = source_file["sheetname"]
row_count = sheet.max_row
source_file.close()

with pd.ExcelWriter("file.xlsx", mode='a', if_sheet_exists='overlay') as writer:  
    data.to_excel(writer, sheet_name='sheetname', index= False, startrow = row_count)

0
def append_to_excel(fpath, df):
 if (os.path.exists(fpath)):
    x=pd.read_excel(fpath)
 else :
    x=pd.DataFrame()

 dfNew=pd.concat([df,x])
 dfNew.to_excel(fpath,index=False)

1
此答案已在低质量队列中进行了审核。以下是如何撰写好的答案?的一些指南。仅有代码的答案不被认为是好的答案,并且很可能会因为对学习者社区不够有用而被投票降低或删除。这只是对您来说很明显。请解释它的作用,以及它与现有答案的不同之处/ 优点来自审核 - Trenton McKinney
3
请勿发布仅包含代码的答案。主要受众——未来的读者——会很感激能够理解为什么这个答案回答了问题,而不是从代码中猜测。由于这是一个旧问题,请解释它如何补充所有其他答案。 - Gert Arnold

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接