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使用ctypes模块调用windowsapi获取系统版本示例
Apr 17 Python
python开发之thread线程基础实例入门
Nov 11 Python
Python基于select实现的socket服务器
Apr 13 Python
python中int与str互转方法
Jul 02 Python
Python语言检测模块langid和langdetect的使用实例
Feb 19 Python
在PYQT5中QscrollArea(滚动条)的使用方法
Jun 14 Python
Python Tornado核心及相关原理详解
Jun 24 Python
利用django创建一个简易的博客网站的示例
Sep 29 Python
Jupyter安装链接aconda实现过程图解
Nov 02 Python
python 基于opencv实现图像增强
Dec 23 Python
python利用appium实现手机APP自动化的示例
Jan 26 Python
python爬虫用request库处理cookie的实例讲解
Feb 20 Python
Python一行代码实现自动发邮件功能
深入解析NumPy中的Broadcasting广播机制
python必学知识之文件操作(建议收藏)
Python使用Kubernetes API访问集群
如何利用pygame实现打飞机小游戏
Python中requests做接口测试的方法
python关于集合的知识案例详解
May 30 #Python
You might like
php 将excel导入mysql
2009/11/09 PHP
PHP自定义函数获取URL中一级域名的方法
2016/08/23 PHP
PHP中使用jQuery+Ajax实现分页查询多功能操作(示例讲解)
2017/09/17 PHP
PHP PDOStatement::errorCode讲解
2019/01/31 PHP
解决PHP curl或file_get_contents下载图片损坏或无法打开的问题
2019/10/11 PHP
Laravel (Lumen) 解决JWT-Auth刷新token的问题
2019/10/24 PHP
宝塔面板在NGINX环境中TP5.1如何运行?
2021/03/09 PHP
通用JS事件写法实现代码
2009/01/07 Javascript
提交表单时执行func方法实现代码
2013/03/17 Javascript
详解JavaScript的变量和数据类型
2015/11/27 Javascript
Bootstrap 网格系统布局详解
2017/03/19 Javascript
详解AngularJS1.6版本中ui-router路由中/#!/的解决方法
2017/05/22 Javascript
JavaScript该如何学习 怎样轻松学习JavaScript
2017/06/12 Javascript
Angular模板表单校验方法详解
2017/08/11 Javascript
js禁止浏览器页面后退功能的实例(推荐)
2017/09/01 Javascript
JavaScript递归函数解“汉诺塔”算法代码解析
2018/07/05 Javascript
微信小程序提交form操作示例
2018/12/30 Javascript
解决vue单页面 回退页面 keeplive 缓存问题
2020/07/22 Javascript
vue-cli 关闭热更新操作
2020/09/18 Javascript
[01:07]2015国际邀请赛 中国区预选赛精彩回顾
2015/06/15 DOTA
Python实现把回车符\r\n转换成\n
2015/04/23 Python
Python实现查找二叉搜索树第k大的节点功能示例
2019/01/24 Python
在OpenCV里使用特征匹配和单映射变换的代码详解
2019/10/23 Python
详解Python中如何将数据存储为json格式的文件
2020/11/18 Python
西班牙英格列斯百货官网:El Corte Inglés
2016/09/25 全球购物
美国NBA官方商店:NBA Store
2019/04/12 全球购物
聚网科技C++面试笔试题
2015/09/01 面试题
旅游专业毕业生自荐书
2014/06/30 职场文书
公司总经理助理岗位职责
2014/07/09 职场文书
政协调研汇报材料
2014/08/15 职场文书
老干部工作先进事迹
2014/08/17 职场文书
大学入学感言
2015/08/01 职场文书
七年级话题作文之执着
2019/11/19 职场文书
Python 如何安装Selenium
2021/05/06 Python
MySQL8.0升级的踩坑历险记
2021/11/01 MySQL
详解Flutter网络请求Dio库的使用及封装
2022/04/14 Java/Android