Python数据处理优化:10万行Excel数据的清洗与分析
我搞定的10万行Excel数据清洗实战与踩坑经验总结前不久接了个内部报表自动化的小活儿客户是家做跨境物流的中型企业。他们每个月都要从各个仓库系统导出一堆业务明细手工拼Excel能折腾到半夜还老出错。这次我拿到的原始文件刚好卡在10万行上下字段杂乱、日期格式千奇百怪。说实话一开始我根本没当回事觉得用pandas随便跑跑就能完事结果真上手才发现这10万行数据背后的IO瓶颈有多磨人。文件一拖进环境光打开进度条就走了小半分钟风扇直接拉满。引擎切换的纠结与最终拍板刚拿到数据文件的时候我习惯性地在IDE里敲了pd.read_excel()。跑了几次之后直接卡死内存占用飙到80%以上进程跟着假死。我当时觉得这样就行结果发现错了。后来试了一圈发现老版本的openpyxl在处理这种带大量合并单元格和公式的xlsx时真的是又慢又吃内存。数据框在解析阶段要把每个单元格都转成Python对象10万行跑下来直接把本地开发机的内存榨干了。面对这个局面我摆出了两个方案。方案A是继续硬扛openpyxl加参数分块读取方案B是直接换上2026年已经普及的PyArrow引擎配合新版的Pandas 3.1。我选了B因为实测下来它的类型推断准得吓人而且底层直接走零拷贝机制配合内存映射技术不需要把整个表塞进Python对象池里折腾。读写十万级数据的时候这种架构差异带来的收益是指数级的。配置起来特别简单就改了一行代码pythonimport pandas as pddf pd.read_excel(monthly_logistics_raw.xlsx, enginepyarrow)有意思的是切换过去之后读取时间直接从两分钟干到了十秒左右。内存峰值也压了一半下来。不过刚跑通的时候我还挺忐忑毕竟PyArrow对某些特殊字符编码的兼容性偶尔会抽风得在测试集上反复验证一下。清洗逻辑重构与多核压榨数据读进来只是第一步真正的重头戏在后面。这批物流单号里混杂了大量无效记录客户还要按省份和城市做交叉透视。原来的写法全是for循环套apply跑一次清洗逻辑要占满单核CPU风扇吼得像起飞一样。坑死了。我第一次写过滤条件的时候顺手用了df.drop_duplicates(subset[order_id])去重。结果系统直接抛出内存溢出警告traceback里全是指向内部排序的报错。排查了好久才发现PyArrow引擎虽然读取快但默认的索引重建机制在这种不规则数据面前反而成了累赘。数据框在内存里来回复制直接撑爆了可用空间。后来我把思路转到了Polars 1.5上。这玩意儿对复杂清洗的支持确实比原生Pandas更顺手语法更紧凑而且天然支持多线程并行计算。我把核心清洗管道重写了一遍pythonimport polars as plpl_df pl.read_excel(monthly_logistics_raw.xlsx)clean_df pl_df.drop_nulls(subset[tracking_no]) \.filter(pl.col(status) shipped) \.group_by([province, city]) \.agg(pl.col(weight).sum())写完这段代码我盯着终端看了半天。原本需要二十分钟的聚合计算现在不到四十秒就出结果了。多核CPU终于没被晾在一边。说实话看到性能曲线平滑降下来的那一刻我才真正体会到向量化运算和底层C实现碾压Python原生循环的威力。不过要注意Polars处理Excel时如果遇到极个别损坏的单元格还是会报解析错误得提前用正则把脏数据兜底清理掉。性能验证与后续迭代验证环节不能省。我把清洗后的数据导出成新的xlsx文件对比了前后两版的耗时和体积。原文件占了大概18MB处理完后缩到了6.2MB。写入速度也快了将近三倍。代码落地其实没什么花哨的核心就是把计算重心往底层引擎靠。我现在每次处理这类十万级表格都会先跑一遍df.info()看数据类型分布。如果发现字符串列特别多会果断把目标列转成category类型这招对节省内存立竿见影。数据在内存里的布局调整好了后续的查询和筛选根本不会卡顿。以前财务小妹加班搞报表的日子彻底翻篇了。说实话技术这东西迭代太快三年前还在死磕openpyxl的老方法现在换个引擎思路直接换天。不过底层原理没变搞清楚数据在内存里是怎么流转的比盲目调优参数管用得多。效率提升百倍不是吹出来的是实实在在跑出来的。本文基于实际项目经验整理欢迎在评论区交流技术问题。