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

    文章

    125

    浏览量

    24845
  • 函数
    +关注

    关注

    3

    文章

    4421

    浏览量

    67820
  • 向量
    +关注

    关注

    0

    文章

    55

    浏览量

    12063

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

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

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    TDK-Lambda GXE600系列600W可编程电源:医疗与工业应用的理想之选

    TDK-Lambda GXE600系列600W可编程电源:医疗与工业应用的理想之选 在电子工程师的日常工作中,电源的选择至关重要,它直接影响着设备的性能、稳定性和可靠性。今天,我们就来详细了解一下
    的头像 发表于 04-18 11:40 162次阅读

    TDK-Lambda CUS600M和CUS600M1系列电源模块深度解析

    TDK-Lambda CUS600M和CUS600M1系列电源模块深度解析 在电子工程师的日常工作中,电源模块的选择至关重要,它直接影响着整个系统的性能和稳定性。今天,我们就来深入探讨一下TDK
    的头像 发表于 04-18 09:05 85次阅读

    RF600E与RF600D:编码器与解码器芯片组的卓越之选

    RF600E与RF600D:编码器与解码器芯片组的卓越之选 在电子设备的世界里,远程控制和数据传输是不可或缺的功能。而RF600E和RF600D这对编码器与解码器芯片组,为我们提供了一
    的头像 发表于 04-14 12:40 157次阅读

    600W单组输出开关电源SE - 600系列:性能与设计解析

    600W单组输出开关电源SE - 600系列:性能与设计解析 在电子设备的电源供应领域,一款性能优良的开关电源至关重要。今天我们就来详细解析SE - 600系列600W单组输出开关电源
    的头像 发表于 04-05 15:15 654次阅读

    PSP-600系列600W电源:带PFC和并联功能的高性能解决方案

    PSP-600系列600W电源:带PFC和并联功能的高性能解决方案 在电子工程师的日常设计工作中,电源模块的选择至关重要,它直接影响着整个系统的性能和稳定性。今天,我们就来详细探讨一下PSP-600
    的头像 发表于 04-05 13:40 597次阅读

    600W单输出医疗型电源MSP - 600系列技术解析

    600W单输出医疗型电源MSP - 600系列技术解析 在医疗电子设备的设计中,电源的稳定性、安全性和高效性至关重要。MSP - 600系列600W单输出医疗型电源,以其出色的性能和丰
    的头像 发表于 04-05 10:15 235次阅读

    HRPG - 600系列600W单输出带PFC功能电源模块解析

    HRPG - 600系列600W单输出带PFC功能电源模块解析 一、引言 在电子设备的设计中,电源模块的性能直接影响着整个系统的稳定性和效率。HRPG - 600系列600W单输出带P
    的头像 发表于 04-05 09:15 260次阅读

    600W工业电源:设计与应用详解

    600W工业电源:设计与应用详解 在工业电子领域,电源的稳定性和性能至关重要。今天要介绍的这款600W工业电源,具备诸多出色的特性,能满足多种工业应用场景的需求。 文件下载
    的头像 发表于 03-30 14:05 169次阅读

    嵌入式开发常用函数速查表

    在嵌入式开发中,掌握常用函数的用法可以大大提高开发效率。无论是单片机初学者还是有一定经验的工程师,熟悉函数库和调用方式都是必备技能。今天,我们为大家整理一份嵌入式开发常用函数速查表,覆盖GPIO
    的头像 发表于 01-19 09:06 452次阅读
    嵌入式开发常用<b class='flag-5'>函数</b>速查表

    探秘PQC600系列600W 3" x 5" AC - DC开放式框架电源转换器

    探秘PQC600系列600W 3 x 5 AC - DC开放式框架电源转换器 在电子设备的设计中,电源供应器就像是设备的“心脏”,为整个系统提供稳定、可靠的电力。今天,我们就来深入了解一下
    的头像 发表于 12-16 15:35 608次阅读

    什么是变镜头

    什么是变镜头变镜头是一种可以连续调节放大倍率或视场范围的光学镜头。它通过内部光学组的相对移动,实现倍率/焦距的连续变化,而且需要保证在变过程中成像仍然清晰、畸变小。特点:适合需要多倍率观察
    的头像 发表于 12-01 15:31 768次阅读
    什么是变<b class='flag-5'>倍</b>镜头

    常用硬件加速的方法

    之前总结了一些常用硬件加速方法 1)面积换速度:也就是串转并运算,可以多个模块同时计算; 2)时间换空间:时序收敛下通过频率提高性能,虽然面积可能稍微加大点; 3)流水线操作:流水线以面积换性能,以
    发表于 10-29 06:20

    RSA加速实现思路

    。 ②使用同步FIFO存取模乘结果S,无需外部读写地址线实现字段更新与读取操作同时进行。 ③使用双DFF结构实现各字段右移一位,当前字段最高位补下一个字段的最低位。 图2 RSA算法加速结果 最后给出RSA算法的加速结果,如图2所示,时钟周期数
    发表于 10-28 07:28

    请问IR600 CLI 如何保存配置?

    IR600 CLI 如何保存配置?
    发表于 08-06 07:51

    详解hal_entry入口函数

    当使用RTOS时,程序从main函数开始进行线程调度;当没有使用RTOS时,C语言程序的入口函数main函数调用了hal_entry函数。由于我们新建的工程是没有选用RTOS的,因此,
    的头像 发表于 07-25 15:34 2209次阅读