乾明 编译整理 
量子位 报道 | 公众号 QbitAI

用Python和Pandas进行数据分析,很快就会用到循环。

但在这其中,就算是较小的DataFrame,使用标准循环也比较耗时。

遇到较大的DataFrame时,需要的时间会更长,会让人更加头疼。

现在,有人忍不了了。他是一位来自德国的数据分析师,名叫Benedikt Droste。

他说,当自己花了大半个小时等待代码执行的时候,决定寻找速度更快的替代方案。

在给出的替代方案中,使用Numpy向量化,与使用标准循环相比,速度提升了71803倍。

他是怎么实现的?我们一起来看看~

标准循环处理3年足球赛数据:20.7秒

DataFrame是具有行和列的Pandas对象。如果使用循环,需要遍历整个对象。

Python不能利用任何内置函数,而且速度很慢。在Benedikt Droste的提供的示例中,是一个包含65列和1140行的Dataframe,包含了2016-2019赛季的足球赛结果。

需要解决的问题是:创建一个新的列,用于指示某个特定的队是否打了平局。可以这样开始:

def soc_loop(leaguedf,TEAM,):    leaguedf['Draws'] = 99999    for row in range(0, len(leaguedf)):        if ((leaguedf['HomeTeam'].iloc[row] == TEAM) & (leaguedf['FTR'].iloc[row] == 'D')) | \            ((leaguedf['AwayTeam'].iloc[row] == TEAM) & (leaguedf['FTR'].iloc[row] == 'D')):            leaguedf['Draws'].iloc[row] = 'Draw'        elif ((leaguedf['HomeTeam'].iloc[row] == TEAM) & (leaguedf['FTR'].iloc[row] != 'D')) | \            ((leaguedf['AwayTeam'].iloc[row] == TEAM) & (leaguedf['FTR'].iloc[row] != 'D')):            leaguedf['Draws'].iloc[row] = 'No_Draw'        else:            leaguedf['Draws'].iloc[row] = 'No_Game'

在这个案例中是阿森纳,在实现目标之前要确认阿森纳参加了哪些场比赛,是主队还是客队。但使用标准循环非常慢,执行时间为20.7秒。

那么,怎么才能更有效率?

Pandas 内置函数: iterrows ()ー快321倍

在第一个示例中,循环遍历了整个DataFrame。iterrows()为每一行返回一个Series,它以索引对的形式遍历DataFrame,以Series的形式遍历感兴趣的列。这使得它比标准循环更快:

def soc_iter(TEAM,home,away,ftr):    #team, row['HomeTeam'], row['AwayTeam'], row['FTR']    if [((home == TEAM) & (ftr == 'D')) | ((away == TEAM) & (ftr == 'D'))]:        result = 'Draw'    elif [((home == TEAM) & (ftr != 'D')) | ((away == TEAM) & (ftr != 'D'))]:        result = 'No_Draw'    else:        result = 'No_Game'    return result

代码运行时间为68毫秒,比标准循环快321倍。但是,许多人建议不要使用它,因为仍然有更快的选项,而且iterrows()不能跨行保存dtype。

这意味着,如果你在DataFrame dtypes上使用iterrows(),可以更改它,但这会导致很多问题。

一定要保存dtypes的话,你还可以使用itertuples()。这里我们不详细讨论 ,你可以在这里找到官方文件:

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.itertuples.html

apply ()方法ー快811倍

apply 本身并不快,但与DataFrame结合使用时,它具有优势。这取决于 apply 表达式的内容。如果可以在 Cython 空间中执行,那么apply要快得多,这里的示例就是这种情况。

大家可以在Lambda函数中使用apply。所要做的就是指定这个轴。在本文的示例中,想要执行按列操作,要使用 axis 1:

这段代码甚至比之前的方法更快,完成时间为27毫秒。

Pandas向量化—快9280倍

此外,也可以利用向量化的优点来创建非常快的代码。

重点是避免像之前的示例中的Python级循环,并使用优化后的C语言代码,这将更有效地使用内存。只需要稍微修改一下函数:

def soc_iter(TEAM,home,away,ftr):    df['Draws'] = 'No_Game'    df.loc[((home == TEAM) & (ftr == 'D')) | ((away == TEAM) & (ftr == 'D')), 'Draws'] = 'Draw'    df.loc[((home == TEAM) & (ftr != 'D')) | ((away == TEAM) & (ftr != 'D')), 'Draws'] = 'No_Draw'

现在,可以用 Pandas 列作为输入创建新列:

在这种情况下,甚至不需要循环。所要做的就是调整函数的内容。现可以直接将Pandas 列传递给函数,从而获得巨大的速度增益。

Numpy向量化—快71803倍

在上面的示例中,将将Pandas 列传递给函数。通过添加.values,可以得到一个Numpy数组:

因为引用了局部性的好处,Numpy数组的速度非常快,代码运行时间仅为0.305毫秒,比一开始使用的标准循环快71803倍。

谁更强一目了然

最后,Benedikt Droste对上述方案进行了总结。

他说,如果你使用Python、Pandas和Numpy进行数据分析,总会有改进代码的空间。

在对上述五种方法进行比较之后,哪个更快一目了然:

从这个图中,可以得出两个结论:

  • 1、如果要使用循环,则应始终选择apply方法。

  • 2、否则,使用向量化是最好的,因为它更快!

原文链接:https://towardsdatascience.com/how-to-make-your-pandas-loop-71-803-times-faster-805030df4f06

直播 | 揭秘最强中文NLP预训练模型

量子位 QbitAI · 头条号签约作者

վ'ᴗ' ի 追踪AI技术和产品新动态

喜欢就点「在看」吧 !

pandas 遍历并修改_Pandas循环提速7万多倍!Python数据分析攻略相关推荐

  1. Pandas循环提速7万多倍!Python数据分析攻略

    乾明 编译整理  量子位 报道 | 公众号 QbitAI 用Python和Pandas进行数据分析,很快就会用到循环. 但在这其中,就算是较小的DataFrame,使用标准循环也比较耗时. 遇到较大的 ...

  2. DSt:数据结构的简介、最强学习路线(逻辑结构【数组-链表-栈和队列/树-图-哈希】、物理结构、数据运算【十大排序/四大查找-图三大搜索-树三大遍历】、高级算法【贪心/分治/动态规划】之详细攻略

    DSt:数据结构的简介.最强学习路线(逻辑结构[数组-链表-栈和队列/树-图-哈希].物理结构[元素/关系].数据运算[十大排序/四大查找-图三大搜索-树三大遍历].高级算法[贪心/分治/动态规划]) ...

  3. Auto CAD:CAD三维建模设计之常用工具(建模、网格、实体编辑、绘图、修改、截面、UCS坐标、视图)之详细攻略

    Auto CAD:CAD三维建模设计之常用工具(建模.网格.实体编辑.绘图.修改.截面.UCS坐标.视图)之详细攻略 目录 CAD三维建模设计之常用工具(建模.网格.实体编辑.绘图.修改.截面.UCS ...

  4. python中for循环缩进_跟小白学Python数据分析——For循环

    原标题:跟小白学Python数据分析--For循环 循环是指反复地连续做某件事,例如地球绕地轴自转一圈就是一天,自转的同时绕太阳公转一圈就是一年.周而复始,转了一圈又一圈,一次又一次地循环. 在编程过 ...

  5. 我的世界服务器指令修复耐久,我的世界修改装备耐久度指令 | 手游网游页游攻略大全...

    发布时间:2017-05-05 我的世界火焰蔓延无伤害了 教你怎修改火焰蔓延指令.那下面的这个攻略则是可以将我的世界里面的火焰蔓延效果造成的伤害忽视掉,那到底是一个盛宴的方法,可以让我们避免受火焰蔓延 ...

  6. insurgency服务器修改,insurgency指令大全 | 手游网游页游攻略大全

    发布时间:2015-10-01 我的世界游戏中玩家可以使用服务器指令来获取和给予权限,轻而易举完成一般玩家做不到的事,非常便利.那么我的世界有哪些服务器指令呢?下面99单机网小编就来汇总我的世界服务器 ...

  7. Python数据攻略-Pandas数据排序方法

    大家好,我是Mr数据杨.我们从数据准备开始,这如同三国的战争前的备战,必须有充足的粮草和士兵.而.sort_values()和.sort_index()方法,则像是战争中的行军路线,决定着军队的移动顺 ...

  8. pandas 更改单元格的值_懂Excel轻松入门Python数据分析包pandas(二十四):连续区域...

    此系列文章收录在公众号中:数据大宇宙 > 数据处理 >E-pd 转发本文并私信我"python",即可获得Python资料以及更多系列文章(持续更新的) 经常听别人说 ...

  9. Python数据攻略-Pandas进行Excel文件读写

    大家好,我是Mr数据杨.让我借<三国演义>中的故事为大家解说今天的Python学习笔记教程. 想象一下,曹操正在用Pandas库排序军队的入门.他将每个兵士的信息视为数据,这些数据需要进行 ...

最新文章

  1. 替换软连接导致的问题
  2. python 如何查看模块所有方法-Python查看模块(变量、函数、类)方法
  3. 确保对象的唯一性——单例模式
  4. OpenCV实现连通域
  5. P2278-[HNOI2003]操作系统【堆】
  6. mysql连接数详解_MySQl 修改最大连接数详解
  7. 2022零售行业消费趋势新主张
  8. 【redis】在spring boot2.0中使用redis的StringRedisTemplate 自动注入@Autowired
  9. ARC单例模式的实现
  10. Intel Multiprocessor System Architecture
  11. 《腾讯产品启示录》学习笔记
  12. select标签如何设置默认选中的选项
  13. 通过分享后的百度网盘链接获取外链图片地址
  14. eda交通灯控制器波形输入_交通灯控制器课程设计.doc
  15. Android 支付宝支付密码输入界面
  16. X_mind思维导图应用以及Windows和安卓软件下载(Free)
  17. 刨根问底:linux中bash shell中SIGHUP和SIGTERM信号的处理
  18. 重磅自动驾驶数据集来了!全球首个多传感器虚拟标注数据集免费开放
  19. 可以计算一元二次方程复数根的模拟计算机
  20. ajax页面拼接html,ajax请求拼接html代码

热门文章

  1. 使用Java WebSockets,JSR 356和JSON映射到POJO的
  2. 自定义Spring Data JPA存储库
  3. GWT MVP变得简单
  4. 使用Selenium或WebDriver测试GWT应用
  5. 带有Spring,Hibernate,Akka,Twitter Bootstrap,Apache Tiles和jQuery的Maven Web项目Kickstarter代码库...
  6. OSGi将Maven与Equinox结合使用
  7. 如何在不到1ms的延迟内完成100K TPS
  8. JS(JavaScript) 使用捕获性分组处理文本模板,最终生成完整字符串
  9. Linux 如何查看命令所在位置/查看命令文件所在位置
  10. 遗传算法求二元函数极值怎么编码_用遗传算法求复杂函数的极值点