查看原文
其他

牛逼!一行代码让 pandas 的 apply 速度飙到极致!

东哥起飞 Python数据科学 2021-08-08

来源:Python数据科学

作者:东哥起飞


文末赠送5本新书

《Python开发技术大全》

前几天,分享了一篇文章,是关于替代pandas的工具vaex。vaex利用了内存映射的原理,所以比pandas能快上几百倍,但是vaex目前功能有限,所以暂时pandas还是无法撼动的。

1. pandas提速的方法回顾

如果想要让pandas提速,东哥总结有两个方法:

1. 向量化

向量化是最优的方法,具体用法参考文章:还在抱怨pandas运行速度慢?这几个方法会颠覆你的看法

举个例子,我们将向量化定义为使用Numpy表示整个数组而不是元素的计算。下面有两个数组:

array_1 = np.array([1,2,3,4,5])
array_2 = np.array([6,7,8,9,10])

我们希望创建一个新数组,该数组是两个数组的总和,结果应该是:

result = [7,9,11,13,15]

当然,我们也可以在Python中使用for循环将这些数组求和,但这非常慢。替代的是,Numpy允许我们直接在阵列上进行操作,这要快得多,尤其是大型阵列。

result = array_1 + array_2

2. 并行化

其次是并行化。
相信大家平时对pandas使用比较多的一个功能就是apply功能,使用自带函数或者自己写个函数,可以直接对dataframe进行变换,非常香!
但由于pandas的apply只是将函数应用于dataframe的每一行,只调用当个处理器,如果行数非常多,那么将非常慢。
但如果我们利用多处理器并行化,将dataframe数据框分成多个部分,然后将每个部分都送到处理器,最后再将各个部分组合拼成回单个dataframe,这就快多了!
如何将这两个方法结合起来,对apply功能提速?

本次给大家分享一个神器 Swifter,可以自动让apply的运行速度达到最快,并且只需要一行代码!

2. Swifter介绍

Swifter是这样做的。
1. 首先,检查apply的函数是否可以向量化,如果可以,就自动使用向量化的计算(最有效果)。
2. 如果无法进行向量化,那就检查使用Dask进行并行处理或仅使用普通Pandas的apply(仅使用单个内核)哪个更合理。
并行化并不是一定要用的,因为并行处理的开销会使小型数据集的处理速度变慢,所以这个也需要根据数据集的大小情况具体分析。
来看一张图。
通过上图结果可以总结出:无论数据大小如何,使用向量化的结果几乎总是更好的,但如果无法做到向量化,那我们就退而求其次,通过并行让pandas速度最优(当数据集大小超过某个阈值的时候,红线和蓝线的交点)。
太牛掰了,使用swifter可以直接为我们自动选择最佳的方式。
3. 如何使用Swifter?
Swifter的使用非常简单。
import pandas as pd
import swifter

df.swifter.apply(lambda x: x.sum() - x.min())
我们只需要引入swifter,然后简单的一行代码调用即可,赶快试一下这个神器!
以上就是本次分享,原创不易,给个三连是对我最大的支持!

文末赠书福利

赠送书籍《Python开发技术大全》5本,此书564页!由「机械工业出版社」赞助提供,如果等不及也可以入手一本学习。

介绍:本书从Python 语言的基础语法讲起,逐步深入地介绍了Python各种库,并且介绍了这些库的实战案例,重点介绍了爬虫开发, GUI应用程序开发,容器管理, Redis数据库操作以及数据处理和神经网络方面的内容。让读者不但可以系统地学习Python编程的相关知识,而且还能对Python在各个领域的应用有更为深入的理解。

参与方式:本篇文章底部「在看」+「留言」,文章内容相关的优质留言才可上墙!留言点赞数量最多前5位读者将获得这本书,截止时间「9月20日20:00」,最终获赠者通过留言联系我。


推荐阅读

卧槽!一个比 pandas 快百倍的大数据分析神器!

用这个网站一查,才知道自己被卖了

再见,可视化!你好,Pandas!

数据科学实战:K-Means 广告效果聚类分析

用了这个jupyter插件,我已经半个月没打开过excel了

安利 5 个拍案叫绝的 Matplotlib 骚操作!

双系统的日子结束了:Windows 和 Linux 将合二为一



求个三连

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存