首先讲一下apply() 与transform()的相同点与不一样点python
相同点:多线程
都能针对dataframe完成特征的计算,而且经常与groupby()方法一块儿使用。app
不一样点:函数
apply()里面能够跟自定义的函数,包括简单的求和函数以及复杂的特征间的差值函数等(注:apply不能直接使用agg()方法 / transform()中的python内置函数,例如sum、max、min、’count‘等方法)大数据
transform() 里面不能跟自定义的特征交互函数,由于transform是真针对每一元素(即每一列特征操做)进行计算,也就是说在使用 transform() 方法时,须要记得三点:线程
一、它只能对每一列进行计算,因此在groupby()以后,.transform()以前是要指定要操做的列,这点也与apply有很大的不一样。3d
二、因为是只能对每一列计算,因此方法的通用性相比apply()就局限了不少,例如只能求列的最大/最小/均值/方差/分箱等操做orm
三、transform还有什么用呢?最简单的状况是试图将函数的结果分配回原始的dataframe。也就是说返回的shape是(len(df),1)。注:若是与groupby()方法联合使用,须要对值进行去重blog
分别计算在一样简单需求下各组合方法的计算时长进程
需求:计算每一个用户天天
某种行为消费次数、消费总额、消费均额、消费最大额、消费最小额
在几个终端支付、最常支付终端号、最常支付终端号的支付次数、最少支付终端号、最少支付终端号的支付次数
某种行为最常消费发生时间段、最常消费发生时间段的消费次数、最少消费发生时间段、最少消费发生时间段的消费次数
某种行为最先消费时间、最晚消费时间
原始数据信息:306626 x 9
具体选择哪一种方法处理,根据实际状况肯定,在面对复杂计算时,transform() 与apply()结合使用每每会有意想不到的效果!
须要注意的是,在与apply()一块儿使用时,transform须要进行去重操做,通常是经过指定一或多个列完成。
此外,匿名函数永远不是一个很好的办法,在进行简单计算时,不管是使用transfrom、agg仍是apply,都要尽量使用自带方法!!!
在使用apply()方法处理大数据级时,能够考虑使用joblib中的多线程/多进程模块构造相应函数执行计算,如下分别是采用多进程和单进程的耗时时长。
能够看到,在260W的数据集上,多进程比单进程的计算速度能够提高约17%~61% 。