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实现批量更换指定目录下文件扩展名的方法
Sep 19 Python
python实现监控某个服务 服务崩溃即发送邮件报告
Jun 21 Python
使用Python的Dataframe取两列时间值相差一年的所有行方法
Jul 10 Python
python实现推箱子游戏
Mar 25 Python
Python实现企业微信机器人每天定时发消息实例
Feb 25 Python
Django实现列表页商品数据返回教程
Apr 03 Python
解决Pycharm双击图标启动不了的问题(JetBrains全家桶通用)
Aug 07 Python
基于python实现操作redis及消息队列
Aug 27 Python
Python __slots__的使用方法
Nov 15 Python
python如何发送带有附件、正文为HTML的邮件
Feb 27 Python
tensorflow+k-means聚类简单实现猫狗图像分类的方法
Apr 28 Python
python工具dtreeviz决策树可视化和模型可解释性
Mar 03 Python
Python一行代码实现自动发邮件功能
深入解析NumPy中的Broadcasting广播机制
python必学知识之文件操作(建议收藏)
Python使用Kubernetes API访问集群
如何利用pygame实现打飞机小游戏
Python中requests做接口测试的方法
python关于集合的知识案例详解
May 30 #Python
You might like
无法在发生错误时创建会话,请检查 PHP 或网站服务器日志,并正确配置 PHP 安装(win+linux)
2012/05/05 PHP
PHP 实现explort() 功能的详解
2013/06/20 PHP
php获取textarea的值并处理回车换行的方法
2014/10/20 PHP
php实现mysql数据库分表分段备份
2015/06/18 PHP
PHP中的print_r 与 var_dump 输出数组
2016/06/13 PHP
用javascript实现兼容IE7的类库 IE7_0_9.zip提供下载
2007/08/08 Javascript
JavaScript中两个感叹号的作用说明
2011/12/28 Javascript
可选择和输入的下拉列表框示例
2013/11/05 Javascript
javascript scrollTop正解使用方法
2013/11/14 Javascript
逐一介绍Jquery data()、Jquery stop()、jquery delay()函数(详)
2015/11/04 Javascript
JavaScript动态检验密码强度的实现方法
2016/11/09 Javascript
Bootstrap文件上传组件之bootstrap fileinput
2016/11/25 Javascript
jquery广告无缝轮播实例
2017/01/05 Javascript
vue组件生命周期详解
2017/11/07 Javascript
vue项目tween方法实现返回顶部的示例代码
2018/03/02 Javascript
vue脚手架搭建项目的兼容性配置详解
2018/07/17 Javascript
nodejs aes 加解密实例
2018/10/10 NodeJs
VUE2.0 ElementUI2.0表格el-table自适应高度的实现方法
2018/11/28 Javascript
如何能分清npm cnpm npx nvm
2019/01/17 Javascript
react同构实践之实现自己的同构模板
2019/03/13 Javascript
vue-cli创建的项目中的gitHooks原理解析
2020/02/14 Javascript
Vue项目vscode 安装eslint插件的方法(代码自动修复)
2020/04/15 Javascript
如何将Node.js中的回调转换为Promise
2020/11/10 Javascript
python实现根据图标提取分类应用程序实例
2014/09/28 Python
Python爬虫代理IP池实现方法
2017/01/05 Python
Python实现获取命令行输出结果的方法
2017/06/10 Python
python获取命令行输入参数列表的实例代码
2018/06/23 Python
Python如何将装饰器定义为类
2020/07/30 Python
墨西哥运动服饰和鞋网上商店:Netshoes墨西哥
2016/07/28 全球购物
2014新年元旦活动策划方案
2014/02/18 职场文书
《姥姥的剪纸》教学反思
2014/02/25 职场文书
2014年三八妇女节活动总结
2014/03/01 职场文书
实习生个人总结范文
2015/02/28 职场文书
退休职工欢送会致辞
2015/08/01 职场文书
创业计划书之干洗店
2019/09/10 职场文书
使用Python脚本对GiteePages进行一键部署的使用说明
2021/05/27 Python