首页 > 解决方案 > Python:将 pandas 数据透视表写入 excel 模板

问题描述

所以我一直在关注这个网站一段时间,以了解我的 Python 知识库。决定在我的第一个问题上深究,所以希望有人能够帮助我。

我目前有以下问题: 尝试将 Pandas Pivot 表打印到预定义的 excel 模板中,例如从单元格 C5

代码在下面,我通过 CSV 加载的表格也在那里

from openpyxl import Workbook
from openpyxl.compat import range
from openpyxl.utils import get_column_letter
from openpyxl import load_workbook
from openpyxl.styles import Alignment
from openpyxl.utils.dataframe import dataframe_to_rows
import pandas as pd

pnl_lst = pd.read_csv('data_test.csv', index_col=0)
pnl_lst = pd.DataFrame(pnl_lst, columns=['Fruit_Veg', 'Item', 'AmountSold','AmountRotten','#ofpickers'])
pnl_lst = pnl_lst.groupby('Fruit_Veg').apply(lambda x: x.pivot_table(index=['Item'],aggfunc='sum',margins=True,margins_name='Total'))
print(pnl_lst)

通过 data_test.csv 输入表

Fruit_Veg 物品 售出金额 金额烂 #ofpickers
1 水果 苹果 0.907502 0.176108 0.365398
2 蔬菜 萝卜 0.707491 0.644805 0.375513
3 水果 0.898554 0.724919 0.338557
4 水果 覆盆子 0.284849 0.023705 0.80169
5 蔬菜 土豆 0.205464 0.682219 0.834467
6 蔬菜 茄子 0.644248 0.531195 0.970782

生成的输出(表格变得奇怪,但第一列中的 Fruit 和 Veg 是合并的单元格):

Fruit_Veg 物品 #ofpickers 金额烂 售出金额
水果 苹果 0.365398283 0.176107564 0.907502485
0.338556856 0.724919365 0.898554328
覆盆子 0.801690277 0.02370525 0.284848945
全部的 1.505645416 0.924732179 2.090905758
蔬菜 茄子 0.970782439 0.531195328 0.644248183
萝卜 0.375513124 0.644804957 0.707491361
土豆 0.834466661 0.682219111 0.20546385
全部的 2.180762224 1.858219396 1.557203394

尝试过的想法(遗憾的是没有运气):

有没有人有任何明智的想法?

非常感谢!

标签: pythonexcelpandasopenpyxlxlsxwriter

解决方案


以下是我如何将我的输出从 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()

推荐阅读