【问题标题】:writing pandas data frame to existing workbook将熊猫数据框写入现有工作簿
【发布时间】:2016-07-26 15:46:14
【问题描述】:

我想将数据框保存到文件的第二张表,但我不能这样做,我不知道为什么。

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)                                          

我已经创建了“分析”工作表,但是当我在其中保存时收到以下响应:“AttributeError: 'Workbook' 对象没有属性 'write'”

我要修改什么?

【问题讨论】:

  • 一个问题是您将yfile 创建为openpyxl 对象,然后将其传递给pd.ExcelWriter,但告诉它应该使用xlsxwriter 引擎。这两个对象不兼容,因此无法正常工作。但是,我不知道它是否可以使用以这种方式创建的 openpyxl 对象和引擎。

标签: python excel pandas


【解决方案1】:

你可以使用append_df_to_excel()辅助函数,即defined in this answer:

演示:

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 测试:

  • 蟒蛇:3.6.4
  • 熊猫:0.22.0
  • openpyxl: 2.4.10

【讨论】:

  • 哦,伙计,我只是在复制你的代码,以为你终于帮我解决了这个问题,但是当我运行这个东西时,它会创建新的工作表,在名称的末尾添加一个 1 而不是替换旧的有新数据的,我该怎么做才能解决这个问题?
  • @mkheifetz,您要替换现有工作表还是在其末尾添加数据?
  • 看起来我已经根据另一篇帖子想通了,谢谢
  • 有没有人修复了替换 Sheet_1 但没有其他工作表的助手?谢谢
  • @Tinkinc,我添加了truncate_sheet 选项;-)
【解决方案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 文件),而这个人可以。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-28
  • 2020-11-05
  • 2016-12-25
  • 2018-11-11
  • 2020-01-15
  • 2016-02-06
  • 2019-04-20
相关资源
最近更新 更多