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之折腾一下目录
Oct 24 Python
Python3中类、模块、错误与异常、文件的简易教程
Nov 20 Python
python 实现对数据集的归一化的方法(0-1之间)
Jul 17 Python
python实现机器学习之元线性回归
Sep 06 Python
Python爬虫基础之XPath语法与lxml库的用法详解
Sep 13 Python
Python查找最长不包含重复字符的子字符串算法示例
Feb 13 Python
python绘制评估优化算法性能的测试函数
Jun 25 Python
OpenCV 轮廓检测的实现方法
Jul 03 Python
Python Numpy,mask图像的生成详解
Feb 19 Python
在Python中使用K-Means聚类和PCA主成分分析进行图像压缩
Apr 10 Python
解决Keyerror ''acc'' KeyError: ''val_acc''问题
Jun 18 Python
Python创建临时文件和文件夹
Aug 05 Python
Python一行代码实现自动发邮件功能
深入解析NumPy中的Broadcasting广播机制
python必学知识之文件操作(建议收藏)
Python使用Kubernetes API访问集群
如何利用pygame实现打飞机小游戏
Python中requests做接口测试的方法
python关于集合的知识案例详解
May 30 #Python
You might like
SONY ICF-F10中波修复记
2021/03/02 无线电
使用 MySQL Date/Time 类型
2008/03/26 PHP
php安全配置 如何配置使其更安全
2011/12/16 PHP
php中hashtable实现示例分享
2014/02/13 PHP
PHP中imagick函数的中文解释
2015/01/21 PHP
thinkphp ajaxfileupload实现异步上传图片的示例
2017/08/28 PHP
js实现文本框中焦点在最后位置
2014/03/04 Javascript
js如何判断用户是否是用微信浏览器
2014/06/05 Javascript
JavaScript实现的双向跨域插件分享
2015/01/31 Javascript
jQuery结合ajax实现动态加载文本内容
2015/05/19 Javascript
简介JavaScript中toUpperCase()方法的使用
2015/06/06 Javascript
JavaScript函数的调用以及参数传递
2015/10/21 Javascript
跟我学习javascript的prototype原型和原型链
2015/11/18 Javascript
Bootstrap每天必学之标签页(Tab)插件
2020/08/09 Javascript
JS实现探测网站链接的方法【测试可用】
2016/11/08 Javascript
超全面的javascript中变量命名规则
2017/02/09 Javascript
vue如何集成raphael.js中国地图的方法示例
2017/08/15 Javascript
Node 使用express-http-proxy 做api网关的实现
2020/10/15 Javascript
小程序实现列表倒计时功能
2021/01/29 Javascript
python密码错误三次锁定(实例讲解)
2017/11/14 Python
把JSON数据格式转换为Python的类对象方法详解(两种方法)
2019/06/04 Python
tensorflow 重置/清除计算图的实现
2020/01/19 Python
Python tkinter模版代码实例
2020/02/05 Python
利用Node实现HTML5离线存储的方法
2020/10/16 HTML / CSS
澳大利亚最大的护发和护肤品购物网站:RY
2019/12/26 全球购物
期末考试动员演讲稿
2014/01/10 职场文书
宿舍违规用电检讨书
2014/02/16 职场文书
学生会宣传部部长竞选演讲稿
2014/04/25 职场文书
2014年安全生产大检查方案
2014/05/13 职场文书
群众路线查摆问题整改措施
2014/10/10 职场文书
个人四风问题整改措施
2014/10/24 职场文书
创卫工作总结2015
2015/04/22 职场文书
幼儿园毕业典礼家长致辞
2015/07/29 职场文书
幼儿园托班教育随笔
2015/08/14 职场文书
升学宴学生致辞
2015/09/29 职场文书
Python可视化神器pyecharts之绘制箱形图
2022/07/07 Python