0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何加速apply函数600倍的技巧

数据分析与开发 来源:kaggle竞赛宝典 作者:杰少 2022-05-12 10:14 次阅读

推荐关注↓

[ 引言 ] 虽然目前dask,cudf等包的出现,使得我们的数据处理大大得到了加速,但是并不是每个人都有比较好的gpu,非常多的朋友仍然还在使用pandas工具包,但有时候真的很无奈,pandas的许多问题我们都需要使用apply函数来进行处理,而apply函数是非常慢的,本文我们就介绍如何加速apply函数600倍的技巧。

实验对比01Apply(Baseline) 我们以Apply为例,原始的Apply函数处理下面这个问题,需要18.4s的时间。
importpandasaspd
importnumpyasnp
df=pd.DataFrame(np.random.randint(0,11,size=(1000000,5)),columns=('a','b','c','d','e'))
deffunc(a,b,c,d,e):
ife==10:
returnc*d
elif(e< 10) and (e>=5):
returnc+d
elife< 5:
        returna+b
%%time
df['new']=df.apply(lambdax:func(x['a'],x['b'],x['c'],x['d'],x['e']),axis=1)
CPUtimes:user17.9s,sys:301ms,total:18.2s
Walltime:18.4s

		
			02Swift加速
											因为处理是并行的,所以我们可以使用Swift进行加速,在使用Swift之后,相同的操作在我的机器上可以提升到7.67s。
			
%%time
#!pipinstallswifter
importswifter
df['new']=df.swifter.apply(lambdax:func(x['a'],x['b'],x['c'],x['d'],x['e']),axis=1)
HBox(children=(HTML(value='DaskApply'),FloatProgress(value=0.0,max=16.0),HTML(value='')))

CPUtimes:user329ms,sys:240ms,total:569ms
Walltime:7.67s

		
			03向量化
											使用Pandas和Numpy的最快方法是将函数向量化。如果我们的操作是可以直接向量化的话,那么我们就尽可能的避免使用:
			
  • for循环;
  • 列表处理;
  • apply等操作
在将上面的问题转化为下面的处理之后,我们的时间缩短为:421 ms。
%%time
df['new']=df['c']*df['d']#defaultcasee==10
mask=df['e']< 10
df.loc[mask,'new']=df['c']+df['d']
mask=df['e']< 5
df.loc[mask,'new']=df['a']+df['b']
CPUtimes:user134ms,sys:149ms,total:283ms
Walltime:421ms

		
			04类别转化+向量化
											我们先将上面的类别转化为int16型,再进行相同的向量化操作,发现时间缩短为:116 ms。
			
forcolin('a','b','c','d'):
df[col]=df[col].astype(np.int16)
%%time
df['new']=df['c']*df['d']#defaultcasee==10
mask=df['e']< 10
df.loc[mask,'new']=df['c']+df['d']
mask=df['e']< 5
df.loc[mask,'new']=df['a']+df['b']
CPUtimes:user71.3ms,sys:42.5ms,total:114ms
Walltime:116ms

		
			
											05转化为values处理
											在能转化为.values的地方尽可能转化为.values,再进行操作。 
			
  • 此处先转化为.values等价于转化为numpy,这样我们的向量化操作会更加快捷。
于是,上面的操作时间又被缩短为:74.9ms。
%%time
df['new']=df['c'].values*df['d'].values#defaultcasee==10
mask=df['e'].values< 10
df.loc[mask,'new']=df['c']+df['d']
mask=df['e'].values< 5
df.loc[mask,'new']=df['a']+df['b']
CPUtimes:user64.5ms,sys:12.5ms,total:77ms
Walltime:74.9ms

		
			

		
			实验汇总
						通过上面的一些小的技巧,我们将简单的Apply函数加速了几百倍,具体的:
			
  • Apply: 18.4 s
  • Apply + Swifter: 7.67 s
  • Pandas vectorizatoin: 421 ms
  • Pandas vectorization + data types: 116 ms
  • Pandas vectorization + values + data types: 74.9ms
参考文献:Do You Use Apply in Pandas? There is a 600x Faster Way

审核编辑 :李倩


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • SWIFT
    +关注

    关注

    0

    文章

    85

    浏览量

    23695
  • 函数
    +关注

    关注

    3

    文章

    3845

    浏览量

    61215
  • 向量
    +关注

    关注

    0

    文章

    54

    浏览量

    11579

原文标题:Pandas 中 Apply 函数加速百倍的技巧

文章出处:【微信号:DBDevs,微信公众号:数据分析与开发】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    回调函数(callback)是什么?回调函数的实现方法

    回调函数是一种特殊的函数,它作为参数传递给另一个函数,并在被调用函数执行完毕后被调用。回调函数通常用于事件处理、异步编程和处理各种操作系统和
    发表于 03-12 11:46 164次阅读

    TC264有矩阵库或三角函数加速库吗?

    在 illd 上搜索了很长时间,并使用了 Google 等搜索引擎。我似乎没有找到矩阵库或相关的三角函数库。不过,我倒是找到了一个类似于 atan2 的反正切加速函数
    发表于 03-05 07:47

    函数指针和指针函数是不是一个东西?

    函数指针的本质是指针,就跟整型指针、字符指针一样,函数指针指向的是一个函数
    的头像 发表于 01-03 16:35 225次阅读
    <b class='flag-5'>函数</b>指针和指针<b class='flag-5'>函数</b>是不是一个东西?

    RX系列三角函数单元(TFU)的使用介绍

    硬件加速器三角函数单元(Trigonometric Function Unit)能够高速处理三角函数sin、cos、arctan和sqrt(x2+y2)函数的运算,可显著减少CPU负荷
    的头像 发表于 12-04 12:25 686次阅读
    RX系列三角<b class='flag-5'>函数</b>单元(TFU)的使用介绍

    c语言中函数函数体用什么符号括起来

    函数 是指将一组能完成一个功能或多个功能的语句放在一起的 代码结构 。 在 C语言程序 中,至少会包含一个函数,及主函数main()。本文将详细讲解关于函数的相关内容。 Part1
    的头像 发表于 11-24 15:52 259次阅读
    c语言中<b class='flag-5'>函数</b>的<b class='flag-5'>函数</b>体用什么符号括起来

    如何查看及更改函数/函数块的调用环境

    模块化设计的思想是把一些相似的功能(比如电机控制、阀控制)设计成函数函数块,这样就可以反复调用。其优点是:使程序架构更加清晰,避免重复编写相似功能的代码。不过可能会产生一个疑惑:既然PLC的程序
    的头像 发表于 11-17 09:08 394次阅读
    如何查看及更改<b class='flag-5'>函数</b>/<b class='flag-5'>函数</b>块的调用环境

    Epos加速度,斜坡函数加速时间分别用在哪里?

    Epos加速度,斜坡函数加速时间分别用在哪里
    发表于 11-08 06:53

    函数类型和函数指针类型的区别

    平时用的更多的是函数指针类型,比如作为函数参数传入回调函数等等。实际上函数类型也是可以作为函数的参数进行传递的。
    发表于 10-24 14:27 128次阅读

    什么是Lambda函数

    和 map() 方法的联用 lambda 函数apply() 方法的联用 什么时候不适合使用 lambda 方法 什么是 Lambda 函数 在Python当中,我们经常使用 lambda 关键字来声明
    的头像 发表于 10-17 11:27 595次阅读

    python函数函数之间的调用

    函数函数之间的调用 3.1 第一种情况 程序代码如下: def x ( f ): def y (): print ( 1 ) return y def f (): print
    的头像 发表于 10-04 17:17 317次阅读

    复变函数的共轭和原函数的关系

    复变函数的共轭和原函数的关系  复变函数的共轭与原函数之间存在着密切的关系,这是因为共轭和原函数都是复数
    的头像 发表于 09-07 16:43 4454次阅读

    一文详解函数指针与回调函数

    函数指针是指向函数的指针变量。它允许我们将函数作为参数传递给其他函数或将函数作为返回值返回。函数
    发表于 08-22 10:36 168次阅读

    Arm RAN加速库资料

    优化的库。 Arm RAN加速库提供: -矢量函数-矩阵函数-下层PHY支持函数-上层PHY支持功能-DU-RU接口支持函数Arm RAN
    发表于 08-08 07:46

    推导电容传感加速度计的传递函数

    传递函数使我们能够描述质量块如何响应外部加速度而移动。在解释加速度计的不同参数(例如传感器线性工作范围和带宽规格)时,将在本系列的后续文章中使用导出的传递函数
    的头像 发表于 06-06 10:43 528次阅读
    推导电容传感<b class='flag-5'>加速</b>度计的传递<b class='flag-5'>函数</b>

    什么是函数的调用?

    函数的调用,就是使用我们已经定义好的函数,或者C语言自带的库函数
    的头像 发表于 04-04 17:21 3749次阅读