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 获取本机ip地址的两个方法
Feb 25 Python
Python实现Tab自动补全和历史命令管理的方法
Mar 12 Python
Python实现的数据结构与算法之队列详解
Apr 22 Python
Python使用matplotlib绘制动画的方法
May 20 Python
python开发之tkinter实现图形随鼠标移动的方法
Nov 11 Python
Python中将字典转换为列表的方法
Sep 21 Python
解决python中os.listdir()函数读取文件夹下文件的乱序和排序问题
Oct 17 Python
浅谈Python中的可迭代对象、迭代器、For循环工作机制、生成器
Mar 11 Python
VPS CENTOS 上配置python,mysql,nginx,uwsgi,django的方法详解
Jul 01 Python
python实现批量文件重命名
Oct 31 Python
python Socket网络编程实现C/S模式和P2P
Jun 22 Python
Python基于爬虫实现全网搜索并下载音乐
Feb 14 Python
Python一行代码实现自动发邮件功能
深入解析NumPy中的Broadcasting广播机制
python必学知识之文件操作(建议收藏)
Python使用Kubernetes API访问集群
如何利用pygame实现打飞机小游戏
Python中requests做接口测试的方法
python关于集合的知识案例详解
May 30 #Python
You might like
PHP的中问验证码
2006/11/25 PHP
认识并使用PHP超级全局变量
2010/01/26 PHP
php tp验证表单与自动填充函数代码
2012/02/22 PHP
php实现的pdo公共类定义与用法示例
2017/07/19 PHP
PHP实现求连续子数组最大和问题2种解决方法
2017/12/26 PHP
golang实现php里的serialize()和unserialize()序列和反序列方法详解
2018/10/30 PHP
浅析PHP反序列化中过滤函数使用不当导致的对象注入问题
2020/02/15 PHP
img的onload的另类用法
2008/01/10 Javascript
jQuery 操作下拉列表框实现代码
2010/02/22 Javascript
解决iframe的frameborder在chrome/ff/ie下的差异
2010/08/12 Javascript
70+漂亮且极具亲和力的导航菜单设计国外网站推荐
2011/09/20 Javascript
jQuery Animation实现CSS3动画示例介绍
2013/08/14 Javascript
jQuery操作JSON的CRUD用法实例
2015/02/25 Javascript
jQuery提示插件alertify使用指南
2015/04/21 Javascript
js获取微信版本号的方法
2015/05/12 Javascript
node.js操作mysql(增删改查)
2015/07/24 Javascript
javascript返回顶部的按钮实现方法
2016/01/09 Javascript
详解开源的JavaScript插件化框架MinimaJS
2017/10/26 Javascript
使用 Javascript 实现浏览器推送提醒功能的示例
2017/11/03 Javascript
vue 实现类似淘宝星级评分的示例
2018/03/01 Javascript
Vue数据监听方法watch的使用
2018/03/28 Javascript
Vue 实例事件简单示例
2019/09/19 Javascript
原生js实现无缝轮播图
2020/01/11 Javascript
[40:55]Liquid vs LGD 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
详解一种用django_cache实现分布式锁的方式
2019/09/01 Python
基于Django快速集成Echarts代码示例
2020/12/01 Python
Python机器学习工具scikit-learn的使用笔记
2021/01/28 Python
使用css3做0.5px的细线的示例代码
2018/01/18 HTML / CSS
Fossil美国官网:化石手表、手袋、首饰及配饰
2019/02/17 全球购物
药品质量检测应届生求职信
2013/11/14 职场文书
毕业生个人求职信范文分享
2014/01/05 职场文书
秘书英文求职信范文
2014/01/31 职场文书
《小山羊和小灰兔》教学反思
2014/02/19 职场文书
安全伴我行演讲稿
2014/09/04 职场文书
大学宣传委员竞选稿
2015/11/19 职场文书
关于nginx 实现jira反向代理的问题
2021/09/25 Servers