python - 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 |
尝试过的想法(遗憾的是没有运气):
- 我可以使用 XlsxWriter 打印 pandas 数据透视表,但这是写入单独的 excel 文件,而不是我需要的模板;
- 使用 Openpyxl 将数据透视表写入 excel 模板,但没有运气,因为格式完全错误,它无法将数据透视表转换为模块随后写入的可读内容;
- 尝试使用 pandas GroupBy 函数复制我的数据透视表。根据上面的输出,我不太清楚如何让 Totals 出现在每个 Fruit_Veg 部分下。
有没有人有任何明智的想法?
非常感谢!
解决方案
以下是我如何将我的输出从 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()
推荐阅读
- code-coverage - AOSP 本机代码覆盖率 - 未找到覆盖率数据
- xampp - 在打开文件时使用 PhpStorm XAMPP 它使用端口 63442 而不是默认端口,我该如何更改它?
- go - 在回合制游戏中同步围棋套路
- ibm-doors - IBM DOORS - 基于属性更新需求
- react-native - 当用户按下返回按钮时如何自动重新加载或刷新整个屏幕。在本机反应
- php - 如何使用 php 将 mysql 数据库中的数据分组到 html 表中
- javascript - 为以下函数-node.js 编写单元测试用例
- web-services - 哪种方法更适合 XSD 中的枚举值?模式验证还是业务验证?
- matlab - 在 for 循环中绘制数据
- php - 错误:无法向服务器发送请求。节点 php-fpm 本地主机