将 Pandas 数据框写入现有工作簿

7
我想将一个数据框保存到文件的第二个工作表中,但我无法实现并且不知道原因。
yfile = openpyxl.load_workbook(new_file, data_only=True) 
ws = yfile.worksheets[0] 
sheet2 = yfile.create_sheet() 
ws2 = yfile.get_sheet_by_name("Sheet").title = "Analysis" 
writer = pd.ExcelWriter(yfile, engine='xlsxwriter') 
df3.to_excel(writer, sheet_name='Analysis') 
writer.save()
yfile.save(new_file)                                          

我创建了名为“Analysis”的表格,但在保存时收到以下响应:“AttributeError:'Workbook'对象没有'write'属性”。 我需要修改什么?

1
一个问题是你正在创建yfile作为一个openpyxl对象,然后将其传递给pd.ExcelWriter,但告诉它应该使用xlsxwriter引擎。这两个对象不兼容,所以这样做是行不通的。然而,我不知道即使使用这种方式创建的openpyxl对象和引擎是否能够工作。 - jmcnamara
2个回答

7
您可以使用append_df_to_excel()辅助函数,该函数在此答案中定义
演示:
In [127]: df = pd.DataFrame(np.random.rand(5, 3), columns=list('abc'))

In [128]: df
Out[128]:
          a         b         c
0  0.597353  0.770586  0.671231
1  0.628605  0.161283  0.397493
2  0.476206  0.701582  0.476809
3  0.045590  0.302834  0.857033
4  0.414820  0.478016  0.563258

In [129]: df.to_excel(filename)

In [130]: append_df_to_excel(filename, df, sheet_name="Sheet2", startrow=1, startcol=1)

In [131]: append_df_to_excel(filename, df, sheet_name="Sheet3", index=False)

In [132]: append_df_to_excel(filename, df, sheet_name="Sheet1", startcol=2, index=False)

结果:

工作表1:

输入图像描述

工作表2:

输入图像描述

工作表3:

输入图像描述

PS 使用以下版本进行测试:

  • python: 3.6.4
  • pandas: 0.22.0
  • openpyxl: 2.4.10

@mkheifetz,您想替换现有的工作表还是将数据添加到其末尾? - MaxU - stand with Ukraine
有人修复了助手以替换Sheet_1,但不影响其他工作表吗?谢谢。 - Tinkinc
@Tinkinc,我不确定我理解你的意思...你到底是什么意思? - MaxU - stand with Ukraine
助手将df插入工作表1中。我只想替换工作表1,而不是不断地追加它。同时保留实际的Excel文件/选项卡(如果存在)。谢谢。 - Tinkinc
1
@Tinkinc,我已经添加了“truncate_sheet”选项;-) - MaxU - stand with Ukraine
显示剩余7条评论

2
您可以使用以下方式。逐行将数据框写入Excel文件。
from openpyxl.utils.dataframe import dataframe_to_rows
filename = r'some_file.xlsx'
df = some_dataframe

wb = load_workbook(filename)
if 'sh2' in wb.sheetnames:#to check whether sheet you need already exists
    ws = wb['sh2']
else:
    ws = wb.active
for r in dataframe_to_rows(df, index=False, header=True):
    ws.append(r)
wb.save(filename)

我已经搜索了整个互联网,只有这个解决方案有效!其他的在Jupyter中可以工作,但在Shell中却不能(会破坏Excel文件),而这个可以。谢谢! - Marta

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