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自动格式化json文件的方法
Mar 11 Python
python计算文本文件行数的方法
Jul 06 Python
Python实现公历(阳历)转农历(阴历)的方法示例
Aug 22 Python
python实现多线程行情抓取工具的方法
Feb 28 Python
学生信息管理系统python版
Oct 17 Python
python命令行参数用法实例分析
Jun 25 Python
Python中面向对象你应该知道的一下知识
Jul 10 Python
pytorch 获取层权重,对特定层注入hook, 提取中间层输出的方法
Aug 17 Python
python add_argument()用法解析
Jan 29 Python
利用pandas向一个csv文件追加写入数据的实现示例
Apr 23 Python
python海龟绘图之画国旗实例代码
Nov 11 Python
浅谈Python项目的服务器部署
Apr 25 Python
Python一行代码实现自动发邮件功能
深入解析NumPy中的Broadcasting广播机制
python必学知识之文件操作(建议收藏)
Python使用Kubernetes API访问集群
如何利用pygame实现打飞机小游戏
Python中requests做接口测试的方法
python关于集合的知识案例详解
May 30 #Python
You might like
php+mysql+jquery实现日历签到功能
2017/02/27 PHP
Laravel框架实现的批量删除功能示例
2019/01/16 PHP
php求斐波那契数的两种实现方式【递归与递推】
2019/09/09 PHP
php实现通过stomp协议连接ActiveMQ操作示例
2020/02/23 PHP
PHP生成图表pChart的示例解析
2020/07/31 PHP
ECMAScript 基础知识
2007/06/29 Javascript
Dom 结点创建 基础知识
2011/10/01 Javascript
10分钟学会写Jquery插件实例教程
2014/09/06 Javascript
浅析AngularJS中的指令
2016/03/20 Javascript
浅析JavaScript中的对象类型Object
2016/05/26 Javascript
JavaScript简单实现弹出拖拽窗口(一)
2016/06/17 Javascript
非常优秀的JS图片轮播插件Swiper的用法
2017/01/03 Javascript
jQuery实现一个简单的轮播图
2017/02/19 Javascript
jquery.uploadifive插件怎么解决上传限制图片或文件大小问题
2017/05/08 jQuery
轻松解决JavaScript定时器越走越快的问题
2019/05/13 Javascript
vue使用prop可以渲染但是打印台报错的解决方式
2019/11/13 Javascript
Vue Render函数原理及代码实例解析
2020/07/30 Javascript
JS将指定的某个字符全部转换为其他字符实例代码
2020/10/13 Javascript
[02:41]《西雅图我们来了》2015国际邀请赛出征全记录
2015/07/23 DOTA
[32:47]完美世界DOTA2联赛 GXR vs IO 第二场 11.07
2020/11/09 DOTA
python爬虫实战之最简单的网页爬虫教程
2017/08/13 Python
详解Python 切片语法
2019/06/10 Python
Python实现快速排序的方法详解
2019/10/25 Python
python实现跨excel sheet复制代码实例
2020/03/03 Python
Django 项目布局方法(值得推荐)
2020/03/22 Python
LivingSocial英国:英国本地优惠
2019/02/22 全球购物
银行开业庆典方案
2014/02/06 职场文书
群众路线教育实践活动心得体会
2014/03/07 职场文书
政治表现评语
2014/05/04 职场文书
班训口号大全
2014/06/18 职场文书
开服装店计划书
2014/08/15 职场文书
经验交流材料格式
2014/12/30 职场文书
2015年销售人员工作总结
2015/04/07 职场文书
spring cloud gateway中如何读取请求参数
2021/07/15 Java/Android
详解Vue的列表渲染
2021/11/20 Vue.js
Win11 PC上的Outlook搜索错误怎么办?
2022/07/15 数码科技