Pandas 中 Apply 函数加速百倍的技巧

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

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

实验对比

01 Apply(Baseline)

我们以Apply为例,原始的Apply函数处理下面这个问题,需要18.4s的时间。

import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randint(0, 11, size=(1000000, 5)), columns=('a','b','c','d','e'))
def func(a,b,c,d,e):
    if e == 10:
        return c*d
    elif (e < 10) and (e>=5):
        return c+d
    elif e < 5:
        return a+b
%%time
df['new'] = df.apply(lambda x: func(x['a'], x['b'], x['c'], x['d'], x['e']), axis=1)
CPU times: user 17.9 s, sys: 301 ms, total: 18.2 s
Wall time: 18.4 s

02 Swift加速

因为处理是并行的,所以我们可以使用Swift进行加速,在使用Swift之后,相同的操作在我的机器上可以提升到7.67s。

%%time
# !pip install swifter
import swifter
df['new'] = df.swifter.apply(lambda x : func(x['a'],x['b'],x['c'],x['d'],x['e']),axis=1)
HBox(children=(HTML(value='Dask Apply'), FloatProgress(value=0.0, max=16.0), HTML(value='')))

CPU times: user 329 ms, sys: 240 ms, total: 569 ms
Wall time: 7.67 s

03 向量化

使用Pandas和Numpy的最快方法是将函数向量化。如果我们的操作是可以直接向量化的话,那么我们就尽可能的避免使用:

  • for循环;

  • 列表处理;

  • apply等操作

在将上面的问题转化为下面的处理之后,我们的时间缩短为:421 ms。

%%time
df['new'] = df['c'] * df['d'] #default case e = =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']
CPU times: user 134 ms, sys: 149 ms, total: 283 ms
Wall time: 421 ms

04 类别转化+向量化

我们先将上面的类别转化为int16型,再进行相同的向量化操作,发现时间缩短为:116 ms。

for col in ('a','b','c','d'):
    df[col] = df[col].astype(np.int16) 
%%time
df['new'] = df['c'] * df['d'] #default case e = =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']
CPU times: user 71.3 ms, sys: 42.5 ms, total: 114 ms
Wall time: 116 ms

05 转化为values处理

在能转化为.values的地方尽可能转化为.values,再进行操作。

  • 此处先转化为.values等价于转化为numpy,这样我们的向量化操作会更加快捷。

于是,上面的操作时间又被缩短为:74.9ms。

%%time
df['new'] = df['c'].values * df['d'].values #default case e = =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']
CPU times: user 64.5 ms, sys: 12.5 ms, total: 77 ms
Wall time: 74.9 ms

实验汇总

通过上面的一些小的技巧,我们将简单的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

作者:程序员小八

https://blog.youkuaiyun.com/z099164/article/details/122379538


 

 

 

 

 

 
推荐阅读:
入门: 最全的零基础学Python的问题  | 零基础学了8个月的Python  | 实战项目 |学Python就是这条捷径
干货:爬取豆瓣短评,电影《后来的我们》 | 38年NBA最佳球员分析 |   从万众期待到口碑扑街!唐探3令人失望  | 笑看新倚天屠龙记 | 灯谜答题王 |用Python做个海量小姐姐素描图 |碟中谍这么火,我用机器学习做个迷你推荐系统电影
趣味:弹球游戏  | 九宫格  | 漂亮的花 | 两百行Python《天天酷跑》游戏!
AI: 会做诗的机器人 | 给图片上色 | 预测收入 | 碟中谍这么火,我用机器学习做个迷你推荐系统电影
小工具: Pdf转Word,轻松搞定表格和水印! | 一键把html网页保存为pdf!|  再见PDF提取收费! | 用90行代码打造最强PDF转换器,word、PPT、excel、markdown、html一键转换 | 制作一款钉钉低价机票提示器! |60行代码做了一个语音壁纸切换器天天看小姐姐!|

年度爆款文案

点阅读原文,看B站我的视频!

Pandas行迭代避坑指南:从itertuples到向量化优化 Pandas作为Python数据分析核心库,其列式存储架构决定了向量化操作是性能基石。理解底层Columnar Storage原理,可规避因误用iterrows、itertuples或apply(axis=1)导致的严重性能衰减与内存爆炸。本文聚焦‘逐行处理’这一高频痛点,解析三种行迭代方法的本质差异、真实压测数据对比及适用边界,并系统梳理‘伪循环依赖’识别方法——如用groupby().cumsum()替代库存滚动计算、np.where()替代条件赋值等向量化三板斧。结合风控API调用、流式分块处理等生产 阅读详情

相关推荐

pandas apply方法速度太慢优化方法之 joblib 包实现多进程

转载:https://blog.youkuaiyun.com/sinat_30353259/article/details/83818646 原理就是joblib会把你的df.groupby()结果进行切分,然后每个块(分组)去跑多进程,然后最后通过concat把每个进程数据合并就好了. 单进程 多进程代码对比: 单进程: %%time def run(df): # print(df) ...

yy的博客 7647

pandas--高质量使用技巧

一、apply 效率低,可以优化的方法 用pandas处理数据时,常需要用到apply方法对某列或者某几列数据进行处理。apply方法便捷易懂,但随着处理数据量的增加以及处理函数的复杂度增加,apply所需要的耗时也会增加。 常见的两种方式: 1、矢量化操作,它是在Pandas中做事的最快方法,且优先考虑内置函数。如下图的pandas vectorization 直接通过列名进行操作,例如进行计算、生成布尔值、字符串操作等。 df['sum'] = df.sum() df['bool'] = d

zhf976650174的博客 705

各种AI的调试日记——辅助工作篇

记录使用各种AI(语言大模型)的心得和总结

m0_73056986的博客 1393

pandas的map、apply、applymap及速度问题

pandas是数据分析的常用工具,其中的map,apply等函数是常用函数。本文简要介绍了pandas中map,apply,applymap三种方法的使用,以及对apply()方法速度的讨论。

几分出发的博客 2459

从原理到实践:详解RGBD相机深度与彩色图像对齐(D2C)算法

本文深入解析了RGBD相机深度与彩色图像对齐(D2C)算法的原理与实现。针对自组装相机中深度图与彩色图不匹配的核心痛点,文章从相机模型、坐标系变换等数学基础讲起,剖析了传统点映射算法的缺陷,并重点介绍了高效的矩形区域映射算法。该算法通过将深度像素视为矩形区域进行映射,有效解决了空洞和遮挡问题,并附有可直接复用的C++代码与优化技巧,为三维重建、机器人视觉等应用奠定坚实基础。

weixin_28363123的博客 243

Paddle账户与支付宝功能快速开通指南:全球化支付解决方案

本文为开发者提供了Paddle账户与支付宝功能集成的详细开通与配置指南。通过Paddle这一全球化支付与销售平台,开发者可一站式管理全球支付与税务合规,而集成支付宝则能无缝覆盖中国用户,实现“一个平台,覆盖全球主流支付方式”,有效提升支付转化率与收款效率。

qq_27496129的博客 1123

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

来源:Python数据科学作者:东哥起飞前几天,分享了一篇文章,是关于替代pandas的工具vaex。vaex利用了内存映射的原理,所以比pandas能快上几百倍,但是vaex目前功能有...

Python数据之道 2617

ST-LINK调试STM32H743必看:CubeMX工程中缺失的这行代码导致程序跑飞

本文深入剖析了使用ST-LINK调试STM32H743时,因CubeMX工程中缺失电源电压档位配置代码而导致程序跑飞或出现“Can not access memory”错误的问题。文章解释了H7系列电源与时钟耦合的核心原理,提供了具体的代码修复方案和系统化的调试排查思路,帮助开发者从根本上解决这一常见调试困境。

weixin_29191669的博客 282

Pandas中Apply函数加速百倍的技巧

点击上方“视学算法”,选择加"星标"或“置顶”重磅干货,第一时间送达作者 | 杰少来源 |kaggle竞赛宝典编辑 | 极市平台导读现在的dask,cudf包的出现,我...

zandaoguang的博客 3145

ABA分析方法 — 软硬件开发必备的一种分析问题绝佳套路

可能你从很多地方听过这个名词,无论是在软件开发还是硬件领域(比较典型的领域:汽车、消费电子、医疗等行业),ABA验证都是一种快速分析故障的一个方法,第一次听到这个词,当时是不是一脸懵逼,本文就深度带你了解下ABA的分析方法。简要概述就是:怀疑A模块导致系统故障,将B模块替换A模块,故障消失,再将A模块替换回来,故障复现,则说明A模块是导致系统故障的原因其实,ABA分析问题,可能很多人在工作中都或多或少用过这个方法,只是没有这个概念,说明白了就是控制变量和对比验证,没什么高大上的东西。

Eureka1024的博客 7350

uniapp - 最新微信小程序手机号一键登录功能效果,uniapp小程序实现手机号码一键登录,uniapp微信小程序端通过手机号授权完成立即登录操作(详细示例源码,新手小白一键复制开箱即用)

uniapp,微信小程序,uniapp小程序平台,uniApp手机号一键登录,uniapp小程序端手机号一键登录功能,实现微信小程序手机号一键登录,在uniapp中实现获取手机一键登录功能,uniapp手机号快捷登录,uniapp微信小程序授权登录并获取手机号,微信小程序手机号快速验证组件调用方式,uniapp小程序怎么用手机号一键登录,uniapp一键登录流程及代码,如何获取手机号一键登录到小程序,微信小程序获取本机手机号一键登录功能,新手详细教程,详细手机一键登录完整示例代码,uni-app微信unia

✅ 精选推荐文章 1万+

Pandas中Apply函数加速百倍的技巧!

来源:kaggle竞赛宝典转自:Python大数据分析大家好,我是小z,也可以叫我阿粥~虽然目前dask,cudf等包的出现,使得我们的数据处理大大得到了加速,但是并不是每个人都有比较好的gpu,非常多的朋友仍然还在使用pandas工具包,但有时候真的很无奈,pandas的许多问题我们都需要使用apply函数来进行处理,而apply函数是非常慢的,本文我们就介绍如何加速a...

SeizeeveryDay的博客 949

【Claude】组织级认证限制报错已解决(4 种)

报错被禁用的是什么谁能解除应急方案整个 Console 组织Anthropic 支持换账户 / 订阅凭证API key 认证方式你的组织管理员用订阅/login订阅 OAuth 登录你的组织管理员用 API keyRoutines 功能你的组织所有者手动计划任务替代共同排查模式/status确认当前凭证;检查环境变量;看清报错消息里命名的是什么(key?组织访问?),对症清除;管理员层面的限制,找管理员解锁。

博客 1万+

Pandas中Apply函数加速百倍的技巧_df.apply()

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

wslejbb的博客 720

YOLOv11改进 | 注意力篇 | YOLOv11引入24年动态卷积块注意力(Dynamic-CBAM),并构建C2PSA_DynamicCBAM

1.Dynamic-CBAM介绍1.1 摘要:重度抑郁症是一种普遍而严重的心理健康状况,对您的情绪,思想,行动和对世界的整体感知产生负面影响。由于抑郁症的症状不明显,确定一个人是否抑郁是很复杂的。然而,他们的声音可能是我们可以识别抑郁症迹象的因素之一。抑郁的人会表现出不适、悲伤,他们可能说话缓慢、颤抖,声音中失去情感。在这项研究中,我们提出了动态卷积块注意力模块(DynamicCBAM),用于在注意力-GRU网络中通过分析人类的音频信号来分类情感。

tsg6698的博客 1003

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

pandas.apply加速-使用swifter

Swfiter是一个库,它“以最快的可用方式将任何函数应用到 Pandas DataFrame(数据框)或Series(序列)。”。 Swfiter安装 Swifter安装 swifter用pip直接安装即可,很方便。 $ pip install -U pandas # upgrade pandas $ pip install swifter # first time installation $ pip install -U swifter # upgrade to latest version if a

qq_38124658的博客 3178

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

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

来源:Python数据科学作者:东哥起飞vaex是pandas的替代工具。它利用了内存映射的原理,所以比pandas能快上几百倍,但是vaex目前功能有限,所以暂时pandas还是无法撼...

Python中文社区 3001

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

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

来源:Python数据科学作者:东哥起飞前几天,分享了一篇文章,是关于替代pandas的工具vaex。vaex利用了内存映射的原理,所以比pandas能快上几百倍,但是vaex目前功能有...

苏克的博客 529

Python中的高效数据处理利用Pandas与NumPy加速分析流程

结合NumPy的astype()和Pandas的convert_dtypes()方法,可在不影响性能的前提下优化内存使用。定期释放不再使用的变量内存,使用Pandas的memory_usage()方法监控内存消耗,确保数据分析流程始终保持高效运行。在金融时间序列分析中,使用Pandas的rolling()函数结合NumPy的向量化计算,可使移动平均计算速度提升40倍。对于基因组数据处理,通过Pandas的cut()函数与NumPy的逻辑运算结合,可实现快速基因序列分类,处理千万行数据仅需数秒。

邋遢大王 319

Pandas数据分析:从基础操作到高级技巧

Pandas作为Python数据分析的核心库,通过其高效的DataFrame和Series数据结构,为处理结构化数据提供了强大支持。其向量化操作原理避免了低效的循环,在数据清洗、转换和聚合等场景中展现出显著性能优势。特别是在电商销售分析、金融数据处理等领域,Pandas的groupby分组聚合与pivot_table透视表功能能够快速生成业务洞见。结合eval表达式优化和swifter并行处理等技巧,即使是百万级数据集也能高效处理。对于数据科学从业者而言,掌握Pandas的数据类型优化和内存管理方法,是构建

weixin_34081595的博客 358
上一篇: 风靡B站的《看漫画学Python》到底是什么来头?
下一篇: 哈哈!一个 print 函数,还挺会玩啊!
菜鸟学Python
博客等级 码龄9年 8088粉丝 571原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值