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标准异常和异常处理详解
Feb 02 Python
python基于urllib实现按照百度音乐分类下载mp3的方法
May 25 Python
Python中的with语句与上下文管理器学习总结
Jun 28 Python
python中使用正则表达式的后向搜索肯定模式(推荐)
Nov 11 Python
Python把csv数据写入list和字典类型的变量脚本方法
Jun 15 Python
pytorch索引查找 index_select的例子
Aug 18 Python
pytorch模型预测结果与ndarray互转方式
Jan 15 Python
Django如何在不停机的情况下创建索引
Aug 02 Python
python判断字符串以什么结尾的实例方法
Sep 18 Python
PyCharm上安装Package的实现(以pandas为例)
Sep 18 Python
Django创建一个后台的基本步骤记录
Oct 02 Python
Anaconda详细安装步骤图文教程
Nov 12 Python
Python一行代码实现自动发邮件功能
深入解析NumPy中的Broadcasting广播机制
python必学知识之文件操作(建议收藏)
Python使用Kubernetes API访问集群
如何利用pygame实现打飞机小游戏
Python中requests做接口测试的方法
python关于集合的知识案例详解
May 30 #Python
You might like
收音机玩机评测 406 篇视频合集
2020/03/11 无线电
笑谈配置,使用Smarty技术
2007/01/04 PHP
PHP共享内存用法实例分析
2016/02/12 PHP
PHP正则获取页面所有图片地址
2016/03/23 PHP
PHP中类与对象功能、用法实例解读
2020/03/27 PHP
javascript中的document.open()方法使用介绍
2013/10/09 Javascript
jQuery中的val()示例应用
2014/02/26 Javascript
JS倒计时代码汇总
2014/11/25 Javascript
JQuery.get提交页面不跳转的解决方法
2015/01/13 Javascript
js分页工具实例
2015/01/28 Javascript
Jquery uploadify上传插件使用详解
2016/01/13 Javascript
jQuery实现的自定义弹出层效果实例详解
2016/09/04 Javascript
原生JS实现几个常用DOM操作API实例
2017/01/19 Javascript
vue一步步实现alert功能
2017/07/05 Javascript
ligerUI---ListBox(列表框可移动的实例)
2017/11/28 Javascript
Angularjs实现数组随机排序的方法
2018/10/02 Javascript
JS实现的全选、全不选及反选功能【案例】
2019/02/19 Javascript
webpack4之如何编写loader的方法步骤
2019/06/06 Javascript
nuxt 页面路由配置,主页轮播组件开发操作
2020/11/05 Javascript
Python实现采用进度条实时显示处理进度的方法
2017/12/19 Python
用tensorflow实现弹性网络回归算法
2018/01/09 Python
Python及Django框架生成二维码的方法分析
2018/01/31 Python
Python可变对象与不可变对象原理解析
2020/02/25 Python
OpenCV Python实现图像指定区域裁剪
2021/03/12 Python
Python爬虫基于lxml解决数据编码乱码问题
2020/07/31 Python
python在一个范围内取随机数的简单实例
2020/08/16 Python
使用python tkinter开发一个爬取B站直播弹幕工具的实现代码
2021/02/07 Python
客服实习的个人自我鉴定
2013/10/20 职场文书
预备党员政审材料
2014/02/04 职场文书
2014年小学英语教师工作总
2014/12/03 职场文书
作文评语集锦
2014/12/25 职场文书
军事理论课感想
2015/08/11 职场文书
新学期家长寄语2016
2015/12/03 职场文书
springboot 多数据源配置不生效遇到的坑及解决
2021/11/17 Java/Android
基于Python实现将列表数据生成折线图
2022/03/23 Python
在Oracle表中进行关键词搜索的过程
2022/06/10 Oracle