无法将枢轴 table 写入 excel 文件
Trouble writing pivot table to excel file
我正在使用 pandas/openpyxl 处理一个 excel 文件,然后创建一个数据透视表 table 以添加到当前工作簿中的新工作 sheet。当我执行我的代码时,新的 sheet 被创建但枢轴 table 没有被添加到 sheet.
这是我的代码:
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)
当我打印出 table 时,我得到了这个:
<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
我希望枢轴 table 看起来像这样:(如果我的枢轴 table 代码不能让它看起来像这样有人可以帮我让它看起来像这样吗?我'我不确定如何添加总计列。它与数据透视表的 aggfunc 部分有关 table 对吗?)
您不能这样做,因为 openpyxl 目前不支持数据透视表。有关详细信息,请参阅 https://bitbucket.org/openpyxl/openpyxl/issues/295。
因为pd.pivot_tablereturns一个dataframe,你可以直接把dataframe写入excel。
以下是我如何将 pandas 数据框的输出写入 excel 模板。
请注意,如果数据已经存在于您尝试写入数据帧的单元格中,它不会被覆盖并且数据帧将被写入新的 sheet 这是我的我已经包含了一个步骤来清除现有的来自模板的数据。我没有尝试在合并的单元格上写入输出,这样可能会引发错误。
设置
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()
我正在使用 pandas/openpyxl 处理一个 excel 文件,然后创建一个数据透视表 table 以添加到当前工作簿中的新工作 sheet。当我执行我的代码时,新的 sheet 被创建但枢轴 table 没有被添加到 sheet.
这是我的代码:
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)
当我打印出 table 时,我得到了这个:
<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
我希望枢轴 table 看起来像这样:(如果我的枢轴 table 代码不能让它看起来像这样有人可以帮我让它看起来像这样吗?我'我不确定如何添加总计列。它与数据透视表的 aggfunc 部分有关 table 对吗?)
您不能这样做,因为 openpyxl 目前不支持数据透视表。有关详细信息,请参阅 https://bitbucket.org/openpyxl/openpyxl/issues/295。
因为pd.pivot_tablereturns一个dataframe,你可以直接把dataframe写入excel。 以下是我如何将 pandas 数据框的输出写入 excel 模板。 请注意,如果数据已经存在于您尝试写入数据帧的单元格中,它不会被覆盖并且数据帧将被写入新的 sheet 这是我的我已经包含了一个步骤来清除现有的来自模板的数据。我没有尝试在合并的单元格上写入输出,这样可能会引发错误。
设置
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()