查看: 121|回复: 3

Python pandas groupby实战:十行代码将Excel大表按部门/城市快速拆分为独立文件

[复制链接]
发表于 2 小时前 | 显示全部楼层 |阅读模式
在日常办公中,我们经常需要将一个包含数千行数据的大Excel表按照特定列(如部门、城市)拆分成多个独立的文件,分发给不同负责人。手动筛选、复制、粘贴不仅耗时且易错。本文介绍如何利用Python的pandas库,通过groupby分组功能,用短短十行代码实现一键拆分,整个过程仅需数秒。

技术原理
核心流程:使用pandas读取总表,通过groupby函数按指定列分组,遍历每个分组并将该分组的数据导出为独立的Excel文件。关键技术点包括:
- pandas的groupby():用于按列的值将数据分组;
- to_excel():将DataFrame写入Excel文件;
- os.makedirs:创建输出目录;
- 文件名安全处理:过滤Windows不允许的字符。

环境准备
需要安装pandas和openpyxl(用于读写.xlsx文件):
  1. pip install pandas openpyxl
复制代码

完整代码及注释
以下函数split_excel_by_column接收输入文件路径、拆分列名和输出目录,实现一键拆分:
  1. import os
  2. import pandas as pd
  3. def split_excel_by_column(input_file, split_column, output_dir="拆分结果"):
  4.     """按指定列拆分Excel总表"""
  5.     # 1. 检查文件是否存在
  6.     if not os.path.exists(input_file):
  7.         print(f"错误:文件 {input_file} 不存在!")
  8.         return
  9.     # 2. 读取总表
  10.     df = pd.read_excel(input_file, engine='openpyxl')
  11.     print(f"总表数据:{len(df)} 行,{len(df.columns)} 列")
  12.     # 3. 验证拆分列是否存在
  13.     if split_column not in df.columns:
  14.         print(f"错误:列名 '{split_column}' 不存在!可用列:{list(df.columns)}")
  15.         return
  16.     # 4. 创建输出目录
  17.     os.makedirs(output_dir, exist_ok=True)
  18.     # 5. 分组并导出
  19.     grouped = df.groupby(split_column)
  20.     group_count = 0
  21.     for group_name, group_df in grouped:
  22.         # 清理文件名中的非法字符
  23.         safe_name = str(group_name).replace('/', '_').replace('\\', '_')
  24.         safe_name = safe_name.replace('*', '').replace('?', '').replace(':', '')
  25.         output_file = os.path.join(output_dir, f"{safe_name}.xlsx")
  26.         group_df.to_excel(output_file, index=False, engine='openpyxl')
  27.         group_count += 1
  28.         print(f"[{group_count}] 已拆分: {safe_name} ({len(group_df)} 行)")
  29.     print(f"\n拆分完成!共生成 {group_count} 个文件,保存在: {output_dir}/")
  30. if __name__ == "__main__":
  31.     # 示例:按部门拆分
  32.     split_excel_by_column(
  33.         input_file="员工花名册总表.xlsx",
  34.         split_column="部门",
  35.         output_dir="按部门拆分"
  36.     )
复制代码

关键步骤解析
1. 读取Excel:pd.read_excel通过openpyxl引擎将Excel加载为DataFrame。
2. 列名验证:检查拆分列是否在df.columns中,避免误输入。
3. groupby分组:df.groupby(split_column)返回一个GroupBy对象,该对象按列值分组。例如,按“部门”分组后,每个部门成为一个组,组名为部门名称,组内为该部门所有行。
4. 遍历导出:for group_name, group_df in grouped: 每个分组的group_name是唯一值,group_df是DataFrame子集。通过to_excel将其写入独立文件,同时使用index=False避免保存行索引。
5. 文件名安全处理:Windows文件名不允许\ / : * ? " < > |等字符,此处做了基本替换,可根据实际需要扩展过滤。

进阶技巧
技巧1:按多列组合拆分
如果需要按“部门+城市”两个维度拆分,可以先组合一列:
  1. df['拆分键'] = df['部门'] + '_' + df['城市']
  2. grouped = df.groupby('拆分键')
复制代码
这样生成的文件名如“技术部_北京.xlsx”。

技巧2:拆分时只保留特定列
有时仅需部分字段,可在导出前筛选列:
  1. keep_columns = ['姓名', '工号', '邮箱', '电话']
  2. existing_columns = [col for col in keep_columns if col in group_df.columns]
  3. group_df[existing_columns].to_excel(output_file, index=False, engine='openpyxl')
复制代码

技巧3:拆分后自动压缩打包
使用shutil将结果目录打包为ZIP方便分发:
  1. import shutil
  2. shutil.make_archive("拆分结果", 'zip', output_dir)
  3. print("已打包为 拆分结果.zip")
复制代码

技巧4:按数值区间拆分
例如按工资区间分组,需要先创建区间标签,再groupby:
  1. df['工资等级'] = pd.cut(df['工资'], bins=[0, 8000, 15000, float('inf')], labels=['初级', '中级', '高级'])
  2. grouped = df.groupby('工资等级')
复制代码

常见问题排查
Q1:拆分后的文件数量比预期的少?
原因:分类值存在全角/半角空格差异,或前后空格未被去除。建议检查唯一值:
  1. print(df['部门'].unique())
  2. print(df['部门'].value_counts())
复制代码
可在分组前对列做strip()处理:df['部门'] = df['部门'].str.strip()。

Q2:拆分出来的文件无法打开?
检查文件名是否含有Windows非法字符(/ \ : * ? " < > |)。代码已做基础过滤,若仍有问题,可增加替换字符种类。

Q3:如何保留源Excel的格式(列宽、字体等)?
pandas导出不保留格式。若需要格式,可先用openpyxl复制模板再逐行写入数据:
  1. from openpyxl import load_workbook
  2. import shutil
  3. shutil.copy("模板.xlsx", output_file)
  4. wb = load_workbook(output_file)
  5. ws = wb.active
  6. for row_idx, row in enumerate(group_df.values, start=2):
  7.     for col_idx, value in enumerate(row, start=1):
  8.         ws.cell(row=row_idx, column=col_idx, value=value)
  9. wb.save(output_file)
复制代码

总结
通过groupby分组拆分Excel是办公自动化的高频场景。结合to_excel导出,只需几行代码即可实现高效拆表。本文涵盖基础用法、多列组合、数值区间、格式保留等扩展,可与之前介绍的Excel合并功能形成前后端互补,覆盖80%的批量Excel处理需求。
回复

使用道具 举报

发表于 1 小时前 | 显示全部楼层

Re: Python pandas groupby实战:十行代码将Excel大表按部门/城市快速拆分为独立文件

很有用的实战分享!之前手动拆分大表确实痛苦,十来行代码就搞定了,收藏了。想请教一下:如果总表里某些列有合并单元格或者公式,用 pandas 读取会不会出问题?另外,对于超大的 Excel(比如几十万行),直接 groupby 再一个一个写文件会不会太慢,有没有办法批量写入或者用多进程加速?
回复 支持 反对

使用道具 举报

发表于 1 小时前 | 显示全部楼层

Re: Python pandas groupby实战:十行代码将Excel大表按部门/城市快速拆分为独立文件

这个帖子太实用了!我之前一直用VBA加手动拆分,遇到几千行的表格经常卡死,用groupby加to_excel确实清爽。试了下你提供的代码,把“部门”换成“城市”直接跑通了,生成的文件名里含斜杠的问题也完美避开。 另外补充一个小经验:如果拆分的列是数值型(比如ID),groupby默认会按大小排序,生成的文件名可能不是原始顺序。可以在groupby前加个sort=False,保持原顺序,更符合业务习惯。 还有,技巧2里筛选列的那个列表推导写法很巧妙,避免了列名不存在时报错,学到了。
回复 支持 反对

使用道具 举报

发表于 1 小时前 | 显示全部楼层

Re: Python pandas groupby实战:十行代码将Excel大表按部门/城市快速拆分为独立文件

这个分享非常实用!工作中经常要按部门拆分报表,以前用VBA写宏,现在看pandas的代码简洁多了。尤其喜欢文件名安全处理和输出目录自动创建这两个细节,考虑得很周到。另外技巧4的数值区间分组也很有启发性,配合pd.cut可以灵活处理很多场景。一个小建议:如果要拆分的列包含中文或特殊符号,导出时可能会遇到编码问题,可以考虑在to_excel里加上encoding参数(不过通常openpyxl会自动处理)。总之收藏了,明天就试试!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

官方邮箱:security#ihonker.org(#改成@)

官方核心成员

关注微信公众号

Archiver|手机版|小黑屋| ( 沪ICP备2021026908号 )

GMT+8, 2026-6-23 11:07 , Processed in 0.028245 second(s), 18 queries , Gzip On, Redis On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部