我使用pandas / openpyxl处理excel文件,然后创建一个数据透视表以添加到当前工作簿中的新工作表。当我执行我的代码时,新工作表会被创建,但数据透视表不会被添加到工作表中。
这是我的代码:
worksheet2 = workbook.create_sheet()
worksheet2.title = 'Sheet1'
workbook.save(filename)
excel = pd.ExcelFile(filename)
df = excel.parse(sheetname=0)
df1 = df[['Product Description', 'Supervisor']]
table1 = pd.pivot_table(df1, index = ['Supervisor'],
columns = ['Product Description'],
values = ['Product Description'],
aggfunc = [lambda x: len(x)], fill_value = 0)
print table1
writer = pd.ExcelWriter(filename)
table1.to_excel(writer, 'Sheet1')
writer.save()
workbook.save(filename)
当我打印出我的桌子时,我得到了这个:
<lambda> \
Product Description EXPRESS 10:30 (doc) EXPRESS 10:30 (nondoc)
Supervisor
Building 0 1
Gordon 1 0
Pete 0 0
Vinny A 0 1
Vinny P 0 1
\
Product Description EXPRESS 12:00 (doc) EXPRESS 12:00 (nondoc)
Supervisor
Building 0 4
Gordon 1 2
Pete 1 0
Vinny A 1 1
Vinny P 0 1
Product Description MEDICAL EXPRESS (nondoc)
Supervisor
Building 0
Gordon 1
Pete 0
Vinny A 0
Vinny P 0
我希望数据透视表看起来像这样:(如果我的数据透视表代码不会让它看起来像这样可以帮助我让它看起来像那样?我不知道如何添加总计列它与数据透视表的aggfunc部分有关吗?)
答案 0 :(得分:1)
您无法执行此操作,因为openpyxl目前不支持数据透视表。有关详细信息,请参阅https://bitbucket.org/openpyxl/openpyxl/issues/295。
答案 1 :(得分:0)
由于 pd.pivot_table 返回一个数据框,您可以将数据框写入 excel。 下面是我如何将我的 Pandas 数据框的输出写入 excel 模板。 请注意,如果您尝试写入数据框的单元格中已经存在数据,则不会覆盖该数据框,并且数据框将写入新工作表中,我已经包含了从模板中清除现有数据的步骤.我没有尝试在合并的单元格上写入输出,因此可能会引发错误。
设置
from openpyxl import load_workbook
from openpyxl.utils.dataframe import dataframe_to_rows
file_path='Template.xlsx'
book=load_workbook(file_path)
writer = pd.ExcelWriter(file_path, engine='openpyxl')
writer.book = book
sheet_name="Template 1"
sheet=book[sheet_name]
在要粘贴输出的 Excel 模板中设置第一行和第一列。 如果我的输出要从单元格 N2 开始粘贴,row_start 将为 2,col_start 将为 14
row_start=2
col_start=14
清除excel模板中已有的数据
for c_idx, col in enumerate(df.columns,col_start):
for r_idx in range(row_start,10001):
sheet.cell(row=r_idx, column=c_idx, value="")
将数据框写入 Excel 模板
rows=dataframe_to_rows(df,index=False)
for r_idx, row in enumerate(rows,row_start):
for c_idx, col in enumerate(row,col_start):
sheet.cell(row=r_idx, column=c_idx, value=col)
writer.save()
writer.close()