You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Pandas透视表按Region拆分写入Excel不同工作表?

按Pandas透视表的Region字段拆分写入多个Excel工作表

问题描述

我有如下所示的Pandas透视表:

Region Dist A B C
X T 1 2 0,5
X V 2 2,5 3
Z T 3 5 8,6
Y P 8,6 7,2 3
Y V 4,5 6,5 5
Z V 7 3,3 4,8
Y T 2 1,6 2,2
X P 3 3,3 2,5
Z P 5,5 6 8

我已完成所有计算,现在想要将其写入Excel用于发布,但不知道如何按'Region'字段拆分写入。本例中需生成X、Y、Z三个工作表,请问如何编写代码实现?
提前致谢!


解决方案

这个需求很常见,用Pandas的groupby配合ExcelWriter就能轻松实现,我给你一步步拆解:

1. 准备依赖和数据

首先确保你安装了pandas和openpyxl(后者是写入.xlsx格式文件的必要依赖),如果没装的话先执行:

pip install pandas openpyxl

然后把你的透视表数据加载成DataFrame——如果是从文本/CSV读取的,要注意处理逗号作为小数分隔符的情况:

import pandas as pd

# 示例:从你提供的文本数据创建DataFrame
data = """Region Dist A B C
X T 1 2 0,5
X V 2 2,5 3
Z T 3 5 8,6
Y P 8,6 7,2 3
Y V 4,5 6,5 5
Z V 7 3,3 4,8
Y T 2 1,6 2,2
X P 3 3,3 2,5
Z P 5,5 6 8"""

# 读取时指定分隔符为空格,小数分隔符为逗号
df = pd.read_csv(pd.compat.StringIO(data), sep=" ", decimal=",")

如果你的数据本来就是处理好的DataFrame(比如已经做完透视表),直接用现有DataFrame即可。

2. 拆分并写入Excel

用ExcelWriter作为上下文管理器,遍历每个Region分组,把每个分组写入对应名称的工作表:

# 创建Excel写入对象,指定输出文件名
with pd.ExcelWriter('region_report.xlsx') as writer:
    # 按Region字段分组,遍历每个分组
    for region_name, region_data in df.groupby('Region'):
        # 将当前分组写入以Region命名的工作表,不包含行索引
        region_data.to_excel(writer, sheet_name=region_name, index=False)

关键细节解释

  • groupby('Region'):把整个DataFrame按Region拆分成X、Y、Z三个子DataFrame,每个子DataFrame对应一个区域的完整数据。
  • pd.ExcelWriter:用上下文管理器的方式创建写入对象,会自动帮你关闭文件,避免资源泄漏。
  • to_excel参数:sheet_name=region_name保证工作表名和区域名完全一致,index=False去掉默认的行号,让输出的Excel更整洁专业。

可选美化(按需使用)

如果要给Excel添加格式(比如调整列宽、设置表头样式),可以结合openpyxl的API进一步处理:

from openpyxl.styles import Font

with pd.ExcelWriter('region_report.xlsx', engine='openpyxl') as writer:
    df.groupby('Region').apply(lambda x: x.to_excel(writer, sheet_name=x.name, index=False))
    # 获取工作簿对象
    workbook = writer.book
    # 遍历每个工作表优化格式
    for sheet_name in workbook.sheetnames:
        worksheet = workbook[sheet_name]
        # 设置表头字体为加粗
        for cell in worksheet[1]:
            cell.font = Font(bold=True)
        # 自动调整列宽
        for column_cells in worksheet.columns:
            length = max(len(str(cell.value)) for cell in column_cells)
            worksheet.column_dimensions[column_cells[0].column_letter].width = length + 2

内容的提问来源于stack exchange,提问作者Tyr

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 10:08:43