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实现在windows服务中新建进程的方法
Jun 30 Python
解决Python获取字典dict中不存在的值时出错问题
Oct 17 Python
python+opencv实现阈值分割
Dec 26 Python
Python多线程threading模块用法实例分析
May 22 Python
python实现连连看辅助之图像识别延伸
Jul 17 Python
django-rest-framework解析请求参数过程详解
Jul 18 Python
python区分不同数据类型的方法
Oct 14 Python
Pytorch根据layers的name冻结训练方式
Jan 06 Python
python实现在线翻译功能
Mar 03 Python
pyinstaller打包成无控制台程序时运行出错(与popen冲突的解决方法)
Apr 15 Python
重写django的model下的objects模型管理器方式
May 15 Python
celery在python爬虫中定时操作实例讲解
Nov 27 Python
Python一行代码实现自动发邮件功能
深入解析NumPy中的Broadcasting广播机制
python必学知识之文件操作(建议收藏)
Python使用Kubernetes API访问集群
如何利用pygame实现打飞机小游戏
Python中requests做接口测试的方法
python关于集合的知识案例详解
May 30 #Python
You might like
php5.4传引用时报错问题分析
2016/01/22 PHP
php文档工具PHP Documentor安装与使用方法
2016/01/25 PHP
PHP制作登录异常ip检测功能的实例代码
2016/11/16 PHP
Laravel 中使用 Vue.js 实现基于 Ajax 的表单提交错误验证操作
2017/06/30 PHP
PHP用swoole+websocket和redis实现web一对一聊天
2019/11/05 PHP
用于table内容排序
2006/07/21 Javascript
从JavaScript 到 JQuery (1)学习小结
2009/02/12 Javascript
Jquery知识点二 jquery下对数组的操作
2011/01/15 Javascript
分享10篇优秀的jQuery幻灯片制作教程及应用案例
2011/04/16 Javascript
jquery索引在使用中的一些困惑
2013/10/24 Javascript
Jquery使用Firefox FireBug插件调试Ajax步骤讲解
2013/12/02 Javascript
jQuery点击改变class并toggle及toggleClass()方法定义用法
2015/12/11 Javascript
IntersectionObserver API 详解篇
2016/12/11 Javascript
layui+SSM的数据表的增删改实例(利用弹框添加、修改)
2019/09/27 Javascript
Js参数RSA加密传输之jsencrypt.js的使用
2020/02/07 Javascript
vue深度监听(监听对象和数组的改变)与立即执行监听实例
2020/09/04 Javascript
python matplotlib 注释文本箭头简单代码示例
2018/01/08 Python
Python文本处理之按行处理大文件的方法
2018/04/09 Python
基于anaconda下强大的conda命令介绍
2018/06/11 Python
Pyinstaller打包.py生成.exe的方法和报错总结
2019/04/02 Python
Python打包工具PyInstaller的安装与pycharm配置支持PyInstaller详细方法
2020/02/27 Python
Python代码中如何读取键盘录入的值
2020/05/27 Python
世界上最好的精品店:Shoptiques
2018/02/05 全球购物
计算机应用职专应届生求职信
2013/11/12 职场文书
农民致富事迹材料
2014/01/23 职场文书
英语教师岗位职责
2014/03/16 职场文书
节电标语大全
2014/06/23 职场文书
会计学毕业生求职信
2014/06/25 职场文书
教师自我剖析材料范文
2014/09/30 职场文书
批评与自我批评范文
2014/10/15 职场文书
2014年学校党建工作总结
2014/11/11 职场文书
秋季运动会开幕词
2015/01/28 职场文书
中秋节随笔
2015/08/15 职场文书
员工工作心得体会
2019/05/07 职场文书
python状态机transitions库详解
2021/06/02 Python
JAVA 线程池(池化技术)的实现原理
2022/04/28 Java/Android