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连接池实现示例程序
Nov 26 Python
用Python制作简单的朴素基数估计器的教程
Apr 01 Python
python开发中range()函数用法实例分析
Nov 12 Python
详解Python 数据库 (sqlite3)应用
Dec 07 Python
Windows系统下多版本pip的共存问题详解
Oct 10 Python
python实现人脸识别经典算法(一) 特征脸法
Mar 13 Python
关于Python正则表达式 findall函数问题详解
Mar 22 Python
selenium 安装与chromedriver安装的方法步骤
Jun 12 Python
使用APScheduler3.0.1 实现定时任务的方法
Jul 22 Python
python 操作hive pyhs2方式
Dec 21 Python
Python的flask接收前台的ajax的post数据和get数据的方法
Apr 12 Python
Python中Schedule模块使用详解 周期任务神器
Apr 19 Python
Python一行代码实现自动发邮件功能
深入解析NumPy中的Broadcasting广播机制
python必学知识之文件操作(建议收藏)
Python使用Kubernetes API访问集群
如何利用pygame实现打飞机小游戏
Python中requests做接口测试的方法
python关于集合的知识案例详解
May 30 #Python
You might like
PHP 和 COM
2006/10/09 PHP
php 利用socket发送HTTP请求(GET,POST)
2015/08/24 PHP
thinkPHP中create方法与令牌验证实例浅析
2015/12/08 PHP
PHP预定义超全局数组变量小结
2018/08/20 PHP
firefox火狐浏览器与与ie兼容的2个问题总结
2010/07/20 Javascript
在vs2010中调试javascript代码方法
2011/02/11 Javascript
jquery的index方法实现tab效果
2011/02/16 Javascript
Firefox/Chrome/Safari的中可直接使用$/$$函数进行调试
2012/02/13 Javascript
PHP和NodeJs开发的应用如何共用Session
2015/04/16 NodeJs
javascript实现鼠标移到Image上方时显示文字效果的方法
2015/08/07 Javascript
使用Sticky组件实现带sticky效果的tab导航和滚动导航的方法
2016/03/22 Javascript
JavaScript判断数组重复内容的两种方法(推荐)
2016/06/06 Javascript
jQuery使用Layer弹出层插件闪退问题
2016/12/22 Javascript
详解nodejs 文本操作模块-fs模块(五)
2016/12/23 NodeJs
AngularJS使用带属性值的ng-app指令实现自定义模块自动加载的方法
2017/01/04 Javascript
windows下vue-cli导入bootstrap样式
2017/04/25 Javascript
Vue.js 的移动端组件库mint-ui实现无限滚动加载更多的方法
2017/12/23 Javascript
Vue项目中使用better-scroll实现一个轮播图自动播放功能
2018/12/03 Javascript
vue项目移动端实现ip输入框问题
2019/03/19 Javascript
你准备好迎接vue3.0了吗
2020/04/28 Javascript
[01:32:50]DOTA2-DPC中国联赛 正赛 DLG vs XG BO3 第一场 1月25日
2021/03/11 DOTA
Python列表(list)常用操作方法小结
2015/02/02 Python
Python编程实现线性回归和批量梯度下降法代码实例
2018/01/04 Python
pandas 使用apply同时处理两列数据的方法
2018/04/20 Python
详解Python的三种可变参数
2019/05/08 Python
Python基于scipy实现信号滤波功能
2019/05/08 Python
全面总结使用CSS实现水平垂直居中效果的方法
2016/03/10 HTML / CSS
汽车电子与维修专业大学生求职信
2013/09/28 职场文书
组织关系转移介绍信
2014/01/16 职场文书
内蒙古鄂尔多斯市市长寄语
2014/04/10 职场文书
建筑节能汇报材料
2014/08/22 职场文书
党员干部观看《周恩来四个昼夜》思想汇报
2014/09/10 职场文书
中小学生学籍证明
2014/10/25 职场文书
感恩教育观后感
2015/06/17 职场文书
安全生产会议制度
2015/08/06 职场文书
JVM上高性能数据格式库包Apache Arrow入门和架构详解(Gkatziouras)
2021/05/26 Servers