pandas中apply和transform方法的性能比较及区别介绍

yipeiwu_com6年前Python基础

1. apply与transform

首先讲一下apply() 与transform()的相同点与不同点

相同点:

都能针对dataframe完成特征的计算,并且常常与groupby()方法一起使用。

不同点:

apply()里面可以跟自定义的函数,包括简单的求和函数以及复杂的特征间的差值函数等(注:apply不能直接使用agg()方法 / transform()中的python内置函数,例如sum、max、min、'count‘等方法)

transform() 里面不能跟自定义的特征交互函数,因为transform是真针对每一元素(即每一列特征操作)进行计算,也就是说在使用 transform() 方法时,需要记得三点:

1、它只能对每一列进行计算,所以在groupby()之后,.transform()之前是要指定要操作的列,这点也与apply有很大的不同。

2、由于是只能对每一列计算,所以方法的通用性相比apply()就局限了很多,例如只能求列的最大/最小/均值/方差/分箱等操作

3、transform还有什么用呢?最简单的情况是试图将函数的结果分配回原始的dataframe。也就是说返回的shape是(len(df),1)。注:如果与groupby()方法联合使用,需要对值进行去重

2. 各方法耗时

分别计算在同样简单需求下各组合方法的计算时长

2.1 transform() 方法+自定义函数


2.2 transform() 方法+python内置方法


2.3 apply() 方法+自定义函数


2.4 agg() 方法+自定义函数


2.5 agg() 方法+python内置方法


2.6 结论

agg()+python内置方法的计算速度最快,其次是transform()+python内置方法。而 transform() 方法+自定义函数 的组合方法最慢,需要避免使用!

而下面两图中红框内容可观察发现:python自带的stats统计模块在pandas结构中的计算也非常慢,也需要避免使用!

3. 实例分析

需求:计算每个用户每天

某种行为消费次数、消费总额、消费均额、消费最大额、消费最小额

在几个终端支付、最常支付终端号、最常支付终端号的支付次数、最少支付终端号、最少支付终端号的支付次数

某种行为最常消费发生时间段、最常消费发生时间段的消费次数、最少消费发生时间段、最少消费发生时间段的消费次数

某种行为最早消费时间、最晚消费时间

原始数据信息:306626 x 9


具体选择哪种方法处理,根据实际情况确定,在面对复杂计算时,transform() 与apply()结合使用往往会有意想不到的效果!

需要注意的是,在与apply()一起使用时,transform需要进行去重操作,一般是通过指定一或多个列完成。

此外,匿名函数永远不是一个很好的办法,在进行简单计算时,无论是使用transfrom、agg还是apply,都要尽可能使用自带方法!!!

4. 小技巧

在使用apply()方法处理大数据级时,可以考虑使用joblib中的多线程/多进程模块构造相应函数执行计算,以下分别是采用多进程和单进程的耗时时长。

可以看到,在260W的数据集上,多进程比单进程的计算速度可以提升约17%~61%  。

总结

以上所述是小编给大家介绍的pandas中apply和transform方法的性能比较,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对【听图阁-专注于Python设计】网站的支持!

相关文章

Python输出带颜色的字符串实例

Python输出带颜色的字符串实例

输出带颜色的字符串,用来显示要突出的部分。经测验,在pycharm中可行,在windows命令行中不可行。原因未知。 方法: 格式:"\033[显示方式;前景色;背景色m 需要变颜色...

深入理解Python中变量赋值的问题

前言 在Python中变量名规则与其他大多数高级语言一样,都是受C语言影响的,另外变量名是大小写敏感的。 Python是动态类型语言,也就是说不需要预先声明变量类型,变量的类型和值在赋值...

window7下的python2.7版本和python3.5版本的opencv-python安装过程

花费了整整2天的时间终于学会安装了opencv,换系统的心都有了,由于ubuntu实在不会玩,看来还是老老实实在windows下安装吧,以此作为记录方便以后安装 python2.7版本的...

对numpy下的轴交换transpose和swapaxes的示例解读

对numpy下的轴交换transpose和swapaxes的示例解读

如下所示: 解读: transpose( ) 方法的参数是一个 由 轴编号(轴编号自0 开始) 序列构成的 元组。 开始时,数组的轴编号序列是默认从 0开始的 :0,1,2,, 坐标...

在Python中使用模块的教程

Python本身就内置了很多非常有用的模块,只要安装完毕,这些模块就可以立刻使用。 我们以内建的sys模块为例,编写一个hello的模块: #!/usr/bin/env python...