用 groupby 拆分数据最可靠,需检查分组列类型与空值,多列组合用列表,文件名须清洗非法字符,大文件应流式写入。

用 pandas.DataFrame.groupby 拆分数据比循环更可靠
直接遍历 df.iterrows() 再按条件写文件,容易漏行、重复或索引错乱。用 groupby 是最稳的路径——它天然按分组键对齐数据,且保留原始列结构。
常见错误是把字符串列当数值用:df.groupby('category') 如果 category 列含空值或混合类型(如 'A' 和 1),会报 TypeError: unhashable type: 'list' 或静默丢弃部分组。
- 拆分前先检查:用
df['column'].dtype确认类型,用df['column'].isna().sum()查空值 - 空值默认被归入单独一组,若不想保存该组,加
dropna=True参数:df.groupby('col', dropna=True) - 多列组合拆分写成元组:
df.groupby(['region', 'year']),注意括号和逗号位置
保存时文件名必须转义非法字符
Windows 对 / : * ? " | 敏感,Linux 对 / 敏感。如果分组字段含斜杠或中文括号,to_csv('{}.csv'.format(group_name)) 会直接抛 OSError: Invalid argument。
别手写正则替换——太容易漏边缘 case。用 re.sub 清洗,但更推荐 pathlib.Path 的 safe_name 思路:
import re
def sanitize_filename(name):
return re.sub(r'[\/*?:"|]', '_', str(name))
-
str(name)防止None或数字类型报错 - 用下划线
_替代非法字符,比删掉更利于追溯原始分组值 - 文件扩展名统一放在最后:
f"{sanitize_filename(key)}.csv",不要拼在key里
大文件慎用 to_csv 全量写入
单个分组数据超 50 万行时,group.to_csv(...) 可能触发内存峰值翻倍——因为 pandas 会临时复制索引和 dtype 信息。
快速生成专业的 Python 脚本和应用代码。一键创建完整项目结构,支持CLI、API、爬虫、Bot、Django等多种项目类型,包含完整的项目结构、配置文件、依赖管理、测试、README和文档。
真正要导出大表,优先走流式写入:
- 用
chunksize分块读源文件,再按条件路由到不同csv.writer对象 - 小文件(groupby + to_csv,简单不易错
- 如果目标格式是 Excel,
openpyxl不支持并发写同一文件,必须每个分组单独Workbook()
拆分后校验行数总和是否等于原表
这是最容易被跳过的动作。看似拆完就完事,但 groupby 默认忽略 NaN 分组、dropna=False 又可能把脏数据塞进文件,最终总行数对不上。
执行完所有保存后,立刻验证:
original_rows = len(df)
split_rows = sum(len(pd.read_csv(f)) for f in Path('.').glob('*.csv'))
assert original_rows == split_rows, f"行数不匹配:原表{original_rows},拆分后{split_rows}"
如果断言失败,优先查 groupby 是否用了 dropna、文件名是否因重名被覆盖、或某分组为空导致未生成文件。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










