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


Posted in Python onMay 30, 2021

前言

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通常可以方便地将所有内容打包在一起。

参考链接

四、其他方式

博客链接

总结

到此这篇关于pandas提升计算效率的文章就介绍到这了,更多相关pandas计算效率内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python通过websocket与js客户端通信示例分析
Jun 25 Python
Python中operator模块的操作符使用示例总结
Jun 28 Python
一些Centos Python 生产环境的部署命令(推荐)
May 07 Python
关于Python的一些学习总结
May 25 Python
python 调用有道api接口的方法
Jan 03 Python
详解安装mitmproxy以及遇到的坑和简单用法
Jan 21 Python
django模板加载静态文件的方法步骤
Mar 01 Python
python实现LBP方法提取图像纹理特征实现分类的步骤
Jul 11 Python
python threading和multiprocessing模块基本用法实例分析
Jul 25 Python
TensorFlow索引与切片的实现方法
Nov 20 Python
Python迭代器模块itertools使用原理解析
Dec 11 Python
Python文件操作函数用法实例详解
Dec 24 Python
Python一行代码实现自动发邮件功能
深入解析NumPy中的Broadcasting广播机制
python必学知识之文件操作(建议收藏)
Python使用Kubernetes API访问集群
如何利用pygame实现打飞机小游戏
Python中requests做接口测试的方法
python关于集合的知识案例详解
May 30 #Python
You might like
php调用nginx的mod_zip模块打包ZIP文件
2014/06/11 PHP
thinkphp5 框架结合plupload实现图片批量上传功能示例
2020/04/04 PHP
JavaScript库 开发规则
2009/01/31 Javascript
jQuery+css实现图片滚动效果(附源码)
2013/03/18 Javascript
在JavaScript中重写jQuery对象的方法实例教程
2014/08/25 Javascript
Google Maps API地图应用示例分享
2014/10/23 Javascript
node.js中的path.delimiter方法使用说明
2014/12/09 Javascript
一张Web前端的思维导图分享
2015/07/03 Javascript
详解javascript遍历方式
2015/11/11 Javascript
js实现prototype扩展的方法(字符串,日期,数组扩展)
2016/01/14 Javascript
基于Bootstrap实现Material Design风格表单插件 附源码下载
2016/04/18 Javascript
AngularJS  ng-repeat遍历输出的用法
2017/06/19 Javascript
AngularJs点击状态值改变背景色的实例
2017/12/18 Javascript
关于vue-router的那些事儿
2018/05/23 Javascript
layUI实现前端分页和后端分页
2019/07/27 Javascript
ant design 日期格式化的实现
2020/10/27 Javascript
python备份文件的脚本
2008/08/11 Python
python采集百度百科的方法
2015/06/05 Python
Python cookbook(数据结构与算法)找出序列中出现次数最多的元素算法示例
2018/03/15 Python
Python查看微信撤回消息代码
2018/06/07 Python
解决Django连接db遇到的问题
2019/08/29 Python
python常用运维脚本实例小结
2020/02/14 Python
Django微信小程序后台开发教程的实现
2020/06/03 Python
将tf.batch_matmul替换成tf.matmul的实现
2020/06/18 Python
布局和排版教程 纯css3实现图片三角形排列
2014/10/17 HTML / CSS
html5 canvas 实现光线沿不规则路径运动
2020/04/20 HTML / CSS
国家地理在线商店:Shop National Geographic
2018/06/30 全球购物
Pop In A Box英国:Funko POP搪胶公仔
2019/05/27 全球购物
有abstract方法的类一定要用abstract修饰吗
2016/03/14 面试题
工程测量与监理专业应届生求职信
2013/11/27 职场文书
大专生找工作自荐书
2014/06/10 职场文书
与美同行演讲稿
2014/09/13 职场文书
MySQL学习总结-基础架构概述
2021/04/05 MySQL
pytorch 如何使用batch训练lstm网络
2021/05/28 Python
草系十大最强宝可梦,纸片人上榜,榜首大家最熟悉
2022/03/18 日漫
【海涛dota】偶遇拉娜娅 质量局德鲁伊第一视角解说
2022/04/01 DOTA