Pandas中高效的“For循环”

news2024/10/1 5:34:26

循环是我们编程技能中的一项固有技能。当我们熟悉任何编程语言时,循环就会成为一个基本的、易于解释的概念。

在这篇博文中,我们将探索遍历pandas dataframe的各种方法,检查每个循环方法的相关运行时。为了验证循环的有效性,我们将生成百万级别的数据,这也是我们在日常处理中经常遇到的数量级。

实验数据集

我们将生成一个包含600万行和4列的DataFrame。每一列将被分配一个0到50之间的随机整数。

 import numpy as np
 import pandas as pd
 df = pd.DataFrame(np.random.randint(0, 50, size=(6000000, 4)), columns=('a','b','c','d'))
 df.shape
 # (6000000, 5)
 df.head()

Iterrows

我们通过基于以下标准引入一个新的列’ e ‘来扩展数据框架’ df ':

如果’ a ‘等于0,那么’ e ‘取’ d ‘的值。如果’ a ‘在0(不包括)到25(包括)的范围内,’ e ‘计算为’ b ‘减去’ c '。如果以上条件都不成立,则计算“e”为“b”+“c”。

首先我们使用pandas提供的’ iterrows() '函数遍历DataFrame ’ df ‘。’ iterrows() '函数遍历DataFrame的行,在迭代期间返回(index, row)对。

 import time 
 start = time.time()
 # Iterating through DataFrame using iterrows
 for idx, row in df.iterrows():
     if row.a == 0:
         df.at[idx,'e'] = row.d
     
     elif (row.a <= 25) & (row.a > 0):
         df.at[idx,'e'] = (row.b)-(row.c)
     else:
         df.at[idx,'e'] = row.b + row.c
 end = time.time()
 print(end - start)
 # time taken: 335.212792634964

iterrows()函数需要335秒(约5.5分钟)来实现对600万行的操作。

Itertuples

另一种遍历pandas DataFrame的方法是使用’ itertuples ',它以命名元组的形式遍历DataFrame行。

下面代码说明了如何使用’ itertuples '访问元素。生成的行对象将索引作为第一个字段,然后是数据框的列。

 for row in df[:1].itertuples():
     print(row)  ## accessing the complete row - index following by columns
     print(row.Index) ## accessing the index of the row
     print(row.a) ## accessing the value of column 'a'

使用下面的代码,使用itertuples()遍历DataFrame df。

 start = time.time()
 # Iterating through namedtuples
 for row in df.itertuples():
     if row.a == 0:
         df.at[row.Index,'e'] = row.d
     
     elif (row.a <= 25) & (row.a > 0):
         df.at[row.Index,'e'] = (row.b)-(row.c)
     else:
         df.at[row.Index,'e'] = row.b + row.c 
         
 end = time.time()
 print(end - start)
 ## Time taken: 41 seconds

在DataFrame上执行所需的操作,itertuples()函数耗时约54秒,比iterrows()函数快6倍。

字典

迭代DataFrame行的另一种方法是将DataFrame转换为字典,这是一种轻量级的内置数据类型。我们遍历该字典以执行所需的操作,然后将更新后的字典转换回DataFrame。转换可以使用’ to_dict() '函数来实现。

 start = time.time()
 # converting the DataFrame to a dictionary
 df_dict = df.to_dict('records')  
 # Iterating through the dictionary 
 for row in df_dict[:]:
     if row['a'] == 0:
         row['e'] = row['d']
     
     elif row['a'] <= 25 & row['a'] > 0:
         row['e'] = row['b']-row['c']
     else:
         row['e'] = row['b'] + row['c']
 # converting back to DataFrame
 df4 = pd.DataFrame(df_dict)
 end = time.time()
 print(end - start)
 ## Time taken: 31 seconds

字典方法大约需要31秒,大约比’ itertuples() '函数快11倍。

数组列表

我们还可以将DataFrame转换为一个数组,遍历该数组以对每行(存储在列表中)执行操作,然后将该列表转换回DataFrame。

 start = time.time()
 # create an empty dictionary
 list2 = []
 # intialize column having 0s. 
 df['e'] = 0
 # iterate through a NumPy array 
 for row in df.values:
     if row[0] == 0:
         row[4] = row[3]
     
     elif row[0] <= 25 & row[0] > 0:
         row[4] = row[1]-row[2]
    
     else:
         row[4] = row[1] + row[2]
 ## append values to a list
     list2.append(row)
 ## convert the list to a dataframe  
 df2 = pd.DataFrame(list2, columns=['a', 'b', 'c', 'd','e'])
 end = time.time()
 print(end - start)
 #Time Taken: 21 seconds

花费的时间约为21秒(比iterrows快16倍),这与遍历字典所花费的时间非常接近。

字典和数组是内置的轻量级数据结构,因此迭代DataFrame所需的时间最少。

总结

在文探索了使用循环遍历DataFrame的四种不同方法。

’ iterrows '函数在遍历DataFrame时显示出最高的时间消耗。与“iterrows”函数相比,使用“itertuples”函数可以使DataFrame迭代的速度提高6倍。在字典和数组上迭代被证明是最有效的方法,使用循环提供最快的迭代时间和最佳的数据操作。

当然,在处理大型数据集时,最佳实践是矢量化。向量化上述代码将执行时间减少到0.29秒(比遍历数组快72倍)。但是使用矢量化时会增加开发的成本,所以在一些时候为了我们开发方便,可以选择一个比较快速for循环来替代矢量化。当然,如果你对矢量化非常的了解,那还是推荐继续使用。

https://avoid.overfit.cn/post/1088344980d94bdc94c1f4c05504f6bc

作者:Anmol Tomar

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1991262.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

3D开发工具HOOPS如何实现数字孪生高效的模型设计和分析?

数字孪生技术通过创建物理对象或系统的虚拟模型&#xff0c;实时反映其状态和行为&#xff0c;从而实现监控、优化和预测。这一技术在智能制造、建筑、城市规划等领域有着广泛应用。HOOPS SDK作为一套功能强大的软件开发工具包&#xff0c;为数字孪生技术的实现提供了全面支持。…

【启明智显分享】烹饪机HMI超值之选:个位数价工业级芯片Model3C点亮4.3寸触摸彩屏

一、方案背景 在快节奏的现代生活中&#xff0c;人们对于美食的追求从未停止&#xff0c;但繁琐的烹饪过程却常常让人望而却步。为了满足人们既能轻松享受美味又能节省时间和精力的需求&#xff0c;自动烹饪机应运而生。目前&#xff0c;自动烹饪机发展也越来越成熟&#xff0…

数据结构 - 哈希表

文章目录 前言一、哈希思想二、哈希表概念三、哈希函数1、哈希函数设计原则2、常用的哈希函数 四、哈希冲突1、什么是哈希冲突2、解决哈希冲突闭散列开散列 五、哈希表的性能分析时间复杂度分析空间复杂度分析 前言 一、哈希思想 哈希思想&#xff08;Hashing&#xff09;是计…

振动分析-18-基于振动分析进行故障诊断的思路和步骤

参考树立正确的振动诊断思路 参考振动分析相关知识的储备及振动分析仪的局限性 参考如何进行振动分析诊断(译文) 1 正确的故障诊断意识 我们通常在学习班听到的是大学教授以及专家讲解的故障诊断的基础理论,对于刚接触这个专业的人来说,微分方程和复杂的矩阵却有点让人忘…

数据库篇--八股文学习第十六天| MySQL的执行引擎有哪些?;MySQL为什么使用B+树来作索引;说一下索引失效的场景?

1、MySQL的执行引擎有哪些&#xff1f; 答&#xff1a; MySQL的执行引擎主要负责查询的执行和数据的存储, 其执行引擎主要有MyISAM、InnoDB、Memery 等。 InnoDB引擎提供了对事务ACID的支持&#xff0c;还提供了行级锁和外键的约束&#xff0c;是目前MySQL的默认存储引擎&…

227还原实战(三)

调转符号 为了方便后面处理 &#xff0c;我们先将所有的 二项表达式 进行预处理&#xff0c;将标识符放在左边&#xff0c; 数字放在右边&#xff0c; 比较简单&#xff0c;不多解释 转换逗号表达式 这里还原逗号表达式就要简单很多&#xff0c;主要是还原三元外的逗号表达式…

Agent知识库:功能、原理浅析

随着LLM不断发展&#xff0c;基于LLM的Agent今年来十分火热。Agent知识库不仅可以存储大量的信息&#xff0c;还包含了丰富的规则、算法和模型&#xff0c;是Agent实现智能化决策和行动的关键。本文将介绍Agent知识库的功能、原理以及相关落地应用。 概览 能力 1.Knowledge&a…

UDP端口可达性检测(端口扫描)工具开发

UDP端口可达性检测(端口扫描)工具开发 1、应用场景分析 主机X与主机Y部署在AB双网环境下&#xff0c;两个主机间通过UDP协议进行数据交互。应用程序发送数据时&#xff0c;优先使用A网发送数据&#xff0c;如果A网异常则通过B网发送数据。两个主机应用间没有设置心跳帧 &…

Vue 3+Vite+Eectron从入门到实战系列之(四)一Electron热身运动(二)

在electron里面能不呢实现暗黑模式和明亮模式的切换&#xff1f;我们怎么读取主进程里面的数据和系统数据。这篇就是来实现这几个效果的 实现效果 更改系统的主题色 在 App.vue 中添加代码。 <el-button type"warning" click"changeTheme">更改系…

Python 进行反射和元编程

反射和元编程是Python中两种强大且高级的编程技术。反射允许程序在运行时检查和修改自身结构和行为&#xff0c;而元编程则是编写可以操作其他代码的代码&#xff0c;通常通过使用元类、装饰器等技术来实现。 1. 反射 反射是指程序在运行时检查和操作自身结构的能力。Python通…

【Dash】使用 dash_mantine_components 创建图表

一、Styling Your App The examples in the previous section used Dash HTML Components to build a simple app layout, but you can style your app to look more professional. This section will give a brief overview of the multiple tools that you can use to enhan…

日常知识点之阿里云服务器提示禁用了密码登录方式

使用阿里云服务器进行一些实例测试时&#xff0c;发现业务启动后&#xff0c;服务器连接卡死&#xff0c;重连显示拒绝密码登录。 尝试好几次&#xff0c;因为在做的业务&#xff0c;怀疑可能时磁盘或者内存导致&#xff0c;但是&#xff0c;这玩意为啥会导致拒绝密码登录也是…

【C++】初识面向对象:类与对象详解

C语法相关知识点可以通过点击以下链接进行学习一起加油&#xff01;命名空间缺省参数与函数重载C相关特性 本章将介绍C中一个重要的概念——类。通过类&#xff0c;我们可以类中定义成员变量和成员函数&#xff0c;实现模块化封装&#xff0c;从而构建更加抽象和复杂的工程。 &…

springboot约车APP-计算机毕业设计源码96773

基于Spring Boot的约车APP设计与实现 摘要 本文基于Spring Boot框架设计并实现了一款约车APP&#xff0c;旨在为用户提供便捷的出行服务。通过后端Spring Boot框架和前端交互界面的设计&#xff0c;实现了用户快速叫车、实时定位、路线规划等功能。系统结合了高效的后端处理和直…

LVS 调度器 nat和DR模式

lvs-nat 修改请求报文的目标IP,多目标IP的DNAT 配置网络 LVS主机 注意网卡的顺序 &#xff08;nat和主机模式&#xff09; [rootlvs ~]# cat /etc/NetworkManager/system-connections/ens160.nmconnection [connection] idens160 typeethernet interface-nameens160 ​ [ip…

[Unity]在场景中随机生成不同位置且不重叠的物体

1.前言 最近任务需要用到Unity在场景中随机生成物体&#xff0c;且这些物体不能重叠&#xff0c;简单记录一下。 参考资料:How to ensure that spawned targets do not overlap ? 2.结果与代码 结果如下所示&#xff1a; 代码如下所示&#xff1a; using System.Collec…

阿一网络安全学院学员作业——XSS DOM 型靶场

第一题 第二题 查看源码发现这里引用的 angular 框架 body 头为 ng-app 搜索文献得知 angular 框架可以将 {{x}} 内部执行函数 试验得知 angular 可以执行 {{ }} 内部函数 那么我们注入代码 {{alert()}} 调用了 search 解释器 那么我们注入的 search 是 先闭合 ”…

详解Xilinx FPGA高速串行收发器GTX/GTP(3)--GTX的时钟架构

目录 1、参考时钟 2、时钟方案 2.1、单个外部参考时钟驱动单个QUAD中的多个transceiver 2.2、单个外部参考时钟驱动多个QUAD中的多个transceiver 2.3、同一个Quad中,多个GTX Transceiver使用多个参考时钟 2.4、不同Quad中,多个GTX Transceiver 使用多个参考时钟 3、QP…

开源免费前端地图开发组件xdh-map

xdh-map是一个基于Openlayers的地图应用Vue组件&#xff0c;具有多方面的功能和特点。以下是对xdh-map的详细介绍&#xff1a; 一、功能与特性 内置多种地图瓦片&#xff1a;xdh-map内置了百度、高德、天地图等地图瓦片&#xff0c;使得开发者可以方便地在应用中集成多种地图…

机器视觉24

block使用流程 初始化工具 初始化相机 拍照事件 保存图片事件 读取图片事件 拍照完成后事件 检测事件 跳转block设置页面 曝光设置 关闭相机 保存图片封装方法 读取图片封装方法 //Block 设置窗体 实时显示 扩展 因为VP中有很多工具 所以在VS中使用时 可能频繁的导入工具…