pandas提升计算效率的一些方法汇总

作者:rs_gis 时间:2023-12-01 00:08:04 

前言

Pandas是为一次性处理整个行或列的矢量化操作而设计的,循环遍历每个单元格、行或列并不是它的设计用途。所以,在使用Pandas时,你应该考虑高度可并行化的矩阵运算。

一、避免使用for循环

尽量使用列号或者行号进行矩阵检索,避免使用for循环。

1.1使用for循环


import os
import pandas as pd
import datetime

path = r'E:\科研文件\shiyan\LZQ\LZQ_all_sampledata.csv'
def read_csv(target_csv):
   target = pd.read_csv(path,header=None,sep=',')
   return target

start_time = datetime.datetime.now()
a = read_csv(path)
for i in range(10000):
   b = a.iloc[i]
end_time = datetime.datetime.now()

print(end_time-start_time)

耗时:0:00:02.455211

1.2使用行号检索


path = r'E:\科研文件\shiyan\LZQ\LZQ_all_sampledata.csv'

def read_csv(target_csv):
   target = pd.read_csv(path,header=None,sep=',')
   return target

start_time = datetime.datetime.now()

a = read_csv(path)

b = a.iloc[10000]

end_time = datetime.datetime.now()

print(end_time-start_time)

耗时:0:00:00.464756

二、使用for循环的条件下提高效率

2.0 如果必须使用for循环如何提高效率

我们可以做的最简单但非常有价值的加速是使用Pandas的内置 .iterrows() 函数。

在上一节中编写for循环时,我们使用了 range() 函数。然而,当我们在Python中对大范围的值进行循环时,生成器往往要快得多。

Pandas的 .iterrows() 函数在内部实现了一个生成器函数,该函数将在每次迭代中生成一行Dataframe。更准确地说,.iterrows() 为DataFrame中的每一行生成(index, Series)的对(元组)。这实际上与在原始Python中使用 enumerate() 之类的东西是一样的,但运行速度要快得多!

生成器(Generators)
生成器函数允许你声明一个行为类似迭代器的函数,也就是说,它可以在for循环中使用。这大大简化了代码,并且比简单的for循环更节省内存。

当你想要处理一个庞大的列表时,比如10亿个浮点数,问题就出现了。使用for循环,在内存中创建了大量的内存huge列表,并不是每个人都有无限的RAM来存储这样的东西!

生成器将创建元素时,仅在需要时将它们存储在内存中。一次一个。这意味着,如果必须创建10亿个浮点数,那么只能一次将它们存储在内存中。Python中的range()函数使用生成器来构建列表。

也就是说,如果你想多次迭代列表并且它足够小以适应内存,那么使用for循环和range函数会更好。这是因为每次访问list值时,生成器和range都会重新生成它们,而range是一个静态列表,并且内存中已存在整数以便快速访问。

2.1使用range


import os
import pandas as pd
import datetime

path = r'E:\科研文件\shiyan\LZQ\LZQ_all_sampledata.csv'

def read_csv(target_csv):
   target = pd.read_csv(path,header=None,sep=',')
   return target

start_time = datetime.datetime.now()

a = read_csv(path)

for data_row in range(a.shape[0]):
   b = a.iloc[data_row]

end_time = datetime.datetime.now()

print(end_time-start_time)

耗时:0:00:07.642816

2.2使用 .iterrows() 代替 range


import os
import pandas as pd
import datetime
path = r'E:\科研文件\shiyan\LZQ\LZQ_all_sampledata.csv'

def read_csv(target_csv):
   target = pd.read_csv(path,header=None,sep=',')
   return target

start_time = datetime.datetime.now()

a = read_csv(path)

for index,data_row in a.iterrows():
   b = data_row

end_time = datetime.datetime.now()

print(end_time-start_time)

耗时:0:00:03.513161

三、使用.apply

iterrows()函数极大地提高了速度,但我们还远远没有完成。请始终记住,当使用为向量操作设计的库时,可能有一种方法可以在完全没有for循环的情况下最高效地完成任务。

为我们提供此功能的Pandas功能是 .apply() 函数。apply()函数接受另一个函数作为输入,并沿着DataFrame的轴(行、列等)应用它。在传递函数的这种情况下,lambda通常可以方便地将所有内容打包在一起。

参考链接

四、其他方式

博客链接

总结

来源:https://blog.csdn.net/rs_gis/article/details/117379071

标签:pandas,for,循环
0
投稿

猜你喜欢

  • Python实现partial改变方法默认参数

    2022-10-30 20:23:33
  • Python+OpenCV图像处理——打印图片属性、设置存储路径、调用摄像头

    2022-10-12 22:54:02
  • 详细介绍在pandas中创建category类型数据的几种方法

    2023-01-13 15:40:57
  • Python基于Webhook实现github自动化部署

    2023-09-28 21:31:27
  • python定时执行指定函数的方法

    2021-04-09 03:20:14
  • Python Numpy之linspace用法说明

    2021-10-17 10:49:55
  • python编程羊车门问题代码示例

    2023-04-10 18:39:19
  • Oracle数据库3种关闭方式

    2008-06-13 16:46:00
  • mysql中redo log和 binlog的区别

    2024-01-14 12:43:52
  • 交互设计实用指南系列(7)–避免迷路

    2010-01-23 09:52:00
  • python实现时间o(1)的最小栈的实例代码

    2021-08-01 15:24:42
  • python查看数据类型的方法

    2021-11-12 03:42:17
  • 根据对象的某一属性进行排序的js代码(如:name,age)

    2023-08-31 14:05:43
  • 解决python 3 urllib 没有 urlencode 属性的问题

    2022-03-31 12:42:44
  • Django 创建/删除用户的示例代码

    2022-09-30 08:59:29
  • python三元运算符实现方法

    2022-08-19 23:11:34
  • python读取文件名称生成list的方法

    2021-12-21 02:40:34
  • 使用DIV+CSS设计网页的好处

    2007-10-14 15:02:00
  • python爬虫 基于requests模块的get请求实现详解

    2021-04-24 17:38:32
  • 解决IE中长按钮的显示问题

    2008-06-24 12:06:00
  • asp之家 网络编程 m.aspxhome.com