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之玩转字符串(3)
Sep 14 Python
用于统计项目中代码总行数的Python脚本分享
Apr 21 Python
Django中更新多个对象数据与删除对象的方法
Jul 17 Python
使用python实现省市三级菜单效果
Jan 20 Python
利用Python循环(包括while&for)各种打印九九乘法表的实例
Nov 06 Python
python编程线性回归代码示例
Dec 07 Python
python实现m3u8格式转换为mp4视频格式
Feb 28 Python
分析python动态规划的递归、非递归实现
Mar 04 Python
把csv文件转化为数组及数组的切片方法
Jul 04 Python
python 统计文件中的字符串数目示例
Dec 24 Python
Python类中的装饰器在当前类中的声明与调用详解
Apr 15 Python
pandas使用函数批量处理数据(map、apply、applymap)
Nov 27 Python
Python一行代码实现自动发邮件功能
深入解析NumPy中的Broadcasting广播机制
python必学知识之文件操作(建议收藏)
Python使用Kubernetes API访问集群
如何利用pygame实现打飞机小游戏
Python中requests做接口测试的方法
python关于集合的知识案例详解
May 30 #Python
You might like
PHP语法速查表
2007/01/02 PHP
ThinkPHP自动完成中使用函数与回调方法实例
2014/11/29 PHP
php面向对象值单例模式
2016/05/03 PHP
JSON字符串传到后台PHP处理问题的解决方法
2016/06/05 PHP
php中str_pad()函数用法分析
2017/03/28 PHP
PHP编程文件处理类SplFileObject和SplFileInfo用法实例分析
2017/07/22 PHP
CL vs ForZe BO5 第五场 2.13
2021/03/10 DOTA
初识javascript 文档碎片
2010/07/13 Javascript
jQuery的12招常用技巧分享
2011/08/08 Javascript
jQuery插件开发基础简单介绍
2013/01/07 Javascript
浅析JS中document对象的一些重要属性
2014/03/06 Javascript
我用的一些Node.js开发工具、开发包、框架等总结
2014/09/25 Javascript
浅谈javascript中的instanceof和typeof
2015/02/27 Javascript
解析JavaScript的ES6版本中的解构赋值
2015/07/28 Javascript
JavaScript前端开发之实现二进制读写操作
2015/11/04 Javascript
JavaScript小技巧整理篇(非常全)
2016/01/26 Javascript
Angularjs中三种数据的绑定策略(“@”,“=”,“&”)
2016/12/23 Javascript
基于javascript实现数字英文验证码
2017/01/25 Javascript
jQuery制作图片旋转效果
2017/02/02 Javascript
纯js实现动态时间显示
2020/09/07 Javascript
js 判断一个数字是不是2的n次方幂的实例
2017/11/26 Javascript
微信小程序云开发 生成带参小程序码流程
2019/05/18 Javascript
python 第三方库的安装及pip的使用详解
2017/05/11 Python
pytorch在fintune时将sequential中的层输出方法,以vgg为例
2019/08/20 Python
Python字符串的修改方法实例
2019/12/19 Python
python爬虫开发之使用python爬虫库requests,urllib与今日头条搜索功能爬取搜索内容实例
2020/03/10 Python
Python pip安装第三方库实现过程解析
2020/07/09 Python
python报错TypeError: ‘NoneType‘ object is not subscriptable的解决方法
2020/11/05 Python
Django模板报TemplateDoesNotExist异常(亲测可行)
2020/12/18 Python
成人教育自我鉴定
2013/11/01 职场文书
高三英语教学反思
2014/01/13 职场文书
交警失职检讨书
2015/01/26 职场文书
评估“风险”创业计划的几大要点
2019/08/12 职场文书
2020年元旦祝福语录,总有适合你的
2019/12/31 职场文书
浅谈怎么给Python添加类型标注
2021/06/08 Python
为什么MySQL分页用limit会越来越慢
2021/07/25 MySQL