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之入门(三)序列
May 25 Python
Python程序中的观察者模式结构编写示例
May 27 Python
浅谈pandas中Dataframe的查询方法([], loc, iloc, at, iat, ix)
Apr 10 Python
Django添加feeds功能的示例
Aug 07 Python
python Flask 装饰器顺序问题解决
Aug 08 Python
Python多进程方式抓取基金网站内容的方法分析
Jun 03 Python
Golang GBK转UTF-8的例子
Aug 26 Python
python如何从文件读取数据及解析
Sep 19 Python
8种常用的Python工具
Aug 05 Python
Django怎么在admin后台注册数据库表
Nov 14 Python
Python getsizeof()和getsize()区分详解
Nov 20 Python
详解Python魔法方法之描述符类
May 26 Python
Python一行代码实现自动发邮件功能
深入解析NumPy中的Broadcasting广播机制
python必学知识之文件操作(建议收藏)
Python使用Kubernetes API访问集群
如何利用pygame实现打飞机小游戏
Python中requests做接口测试的方法
python关于集合的知识案例详解
May 30 #Python
You might like
PHP小技巧搜集,每个PHPer都来露一手
2007/01/02 PHP
超强分页类2.0发布,支持自定义风格,默认4种显示模式
2007/01/02 PHP
header中Content-Disposition的作用与使用方法
2012/06/13 PHP
php生成不重复随机数、数组的4种方法分享
2015/03/30 PHP
使用PHP similar text计算两个字符串相似度
2015/11/06 PHP
ThinkPHP中图片按比例切割的代码实例
2019/03/08 PHP
js自动生成的元素与页面原有元素发生堆叠的解决方法
2013/10/24 Javascript
jQuery常用且重要方法汇总
2015/07/13 Javascript
JS实现动态生成表格并提交表格数据向后端
2020/11/25 Javascript
Avalon中文长字符截取、关键字符隐藏、自定义过滤器
2016/05/18 Javascript
JS对HTML表格进行增删改操作
2016/08/22 Javascript
JS转换HTML转义符的方法
2016/08/24 Javascript
基于jQuery实现表格的排序
2016/12/02 Javascript
jQuery实现大图轮播
2017/02/13 Javascript
javascript实现圣旨卷轴展开效果(代码分享)
2017/03/23 Javascript
React Native实现进度条弹框的示例代码
2017/07/17 Javascript
jQuery选择器选中最后一个元素,倒数第二个元素操作示例
2018/12/10 jQuery
vue.js实现回到顶部动画效果
2019/07/31 Javascript
JavaScript判断数组类型的方法
2019/10/23 Javascript
Vue数据双向绑定原理实例解析
2020/05/15 Javascript
python使用多线程不断刷新网页的方法
2015/03/31 Python
Python pandas常用函数详解
2018/02/07 Python
使用python telnetlib批量备份交换机配置的方法
2019/07/25 Python
python脚本后台执行方式
2019/12/21 Python
开启Django博客的RSS功能的实现方法
2020/02/17 Python
基于virtualenv创建python虚拟环境过程图解
2020/03/30 Python
Python如何操作office实现自动化及win32com.client的运用
2020/04/01 Python
python传到前端的数据,双引号被转义的问题
2020/04/03 Python
Python scrapy爬取小说代码案例详解
2020/07/09 Python
Python中的None与 NULL(即空字符)的区别详解
2020/09/24 Python
拉夫劳伦爱尔兰官方网站:Ralph Lauren爱尔兰
2020/04/10 全球购物
工程造价专业大学生职业生涯规划书
2014/01/18 职场文书
打架检讨书500字
2014/01/29 职场文书
简单了解 MySQL 中相关的锁
2021/05/25 MySQL
Python实现简单的猜单词
2021/06/15 Python
Win2008系统搭建DHCP服务器
2022/06/25 Servers