使用 Pandas 做数据清洗、特征工程、或是把模型输入准备好时,经常会跑 apply、map、applymap 这种操作。Pandas 本身是单线程的,数据一大,慢得让人抓狂。Pandarallel 就是来帮忙的:它提供了几乎只要改一行代码就能并行化 Pandas 操作的能力,还能显示进度条。简单、直观,很适合想“立刻提升速度”但又不想重写代码的你。
它是个什么工具?Pandarallel 是一个小巧的 Python 库,用 multiprocessing(多进程)把常见的 Pandas 操作并行化。你只需在程序开始时初始化一次,然后把 df.apply、Series.map 等替换成对应的并行版本(例如 df.parallel_apply),就能利用机器上所有 CPU 核心。它也会显示进度条,方便监控。
它解决了哪些痛点?
- • Pandas 单线程慢:大表用 apply 一遍就是好几分钟;Pandarallel 能把任务分发到多个核心。
- • 并行实现复杂:自己写分片、进程管理、数据通信容易踩坑;Pandarallel 把这些封装好了。
- • 想看进度?Pandarallel 带进度条,不用手动 print。
当然也不是万能:有启动/序列化开销、内存拷贝问题、函数必须可 pickling 等限制(后面详述)。
安装很简单在终端跑:pip install pandarallel
(需要时加 --upgrade 或 --user)
快速上手(最少改动)示例代码(核心只有一行不一样):
from pandarallel import pandarallel
初始化(开启进度条)
pandarallel.initialize(progress_bar=True)
然后把 apply 换成 parallel_apply
df.parallel_apply(func, axis=1)
其他常用:parallel_applymap、Series.parallel_map、GroupBy 的并行版本等(具体 API 请看项目文档)。如果你机器 CPU 多,pandarallel 会自动使用所有可用核,也可以手动指定 nb_workers 参数。
举几个实战小例子
- • 行级复杂计算:df.parallel_apply(lambda row: heavy_calc(row), axis=1)
- • 列内元素级转换:df.parallel_applymap(lambda x: transform(x))
- • 对 Series 做映射:s.parallel_map(lambda v: lookup(v))
(注意:要保证传入的函数可以被进程序列化/pickle)
优缺点对比表(简明)
| |
| |
| |
| |
| Windows 上 spawn 模式导致额外开销(Linux/Mac 效率更好) |
| |
总结 — 值不值得用?如果你是日常用 Pandas 的同学,遇到 apply/map 这些慢得想哭的操作,Pandarallel 是一个非常值得尝试的“快速加速器”。它让你几乎不用重构代码就能跑多核,进度条也方便。缺点主要是内存和序列化带来的限制、以及在 Windows 上可能效果不佳。所以推荐的做法:先在开发机或小样本上试试,确认性能与结果,然后再把它用于生产任务。
项目地址:https://github.com/nalepae/pandarallel