Pandas探索之高性能函数eval和query解析


Posted in Python onOctober 28, 2017

Python Data Analysis Library 或 pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。Pandas 纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具。pandas提供了大量能使我们快速便捷地处理数据的函数和方法。你很快就会发现,它是使Python成为强大而高效的数据分析环境的重要因素之一。

相较于 Python 的内置函数, Pandas 库为我们提供了一系列性能更高的数据处理函数,本节将向大家介绍 Pandas 库中的高性能函数 eval 与 query:

在 Python 中,我们可以用很多种的方法来实现同样的目标,例如实现两个数组的相加:

import numpy as np 
rng = np.random.RandomState(42) 
x = rng.rand(1E6) 
y = rng.rand(1E6) 
%timeit x + y 
100 loops, best of 3: 3.39 ms per loop

利用 Numpy 中的 fromiter 函数我们可以得到相同的一维数组,然而我们发现,这个语句的性能并不比内置的数组加法好。

%timeit np.fromiter((xi + yi for xi, yi in zip(x, y)), 
dtype=x.dtype, count=len(x)) 
1 loop, best of 3: 266 ms per loop

再比如,进行某一项条件的判断:

mask = (x > 0.5) & (y < 0.5) 
tmp1 = (x > 0.5) 
tmp2 = (y < 0.5) 
mask = tmp1 & tmp2

Numpy 库中的函数 allclose 用于判断两个数组是否相等,我们可以看到,使用 numexpr 库中的 evaluate 函数同样可以实现 mask 中的条件判断。

import numexpr 
mask_numexpr = numexpr.evaluate('(x > 0.5) & (y < 0.5)') 
np.allclose(mask, mask_numexpr) 
True

面对同样的问题,Pandas 库为我们提供了更高性能的解决方案, eval 函数能够将特定形式的字符串转换为对应含义的逻辑判断或运算,比 Python 的内置函数具有更好的算法效率:

import pandas as pd 
nrows, ncols = 100000, 100 
rng = np.random.RandomState(42) 
df1, df2, df3, df4 = (pd.DataFrame(rng.rand(nrows, ncols)) 
for i in range(4)) 
%timeit df1 + df2 + df3 + df4 
10 loops, best of 3: 87.1 ms per loop 
%timeit pd.eval('df1 + df2 + df3 + df4') 
10 loops, best of 3: 42.2 ms per loop 
np.allclose(df1 + df2 + df3 + df4, 
pd.eval('df1 + df2 + df3 + df4')) 
True

可以看到,eval 函数实现了等价的计算,并且具有更高的性能。除了加法运算,Pandas 的函数 eval 还能帮助我们实现其他多种复杂的逻辑判断或计算:

总结

以上就是本文关于Pandas探索之高性能函数eval和query解析的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站:Python探索之URL Dispatcher实例详解、Python编程之Re模块下的函数介绍等,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

Python 相关文章推荐
使用python装饰器验证配置文件示例
Feb 24 Python
python实现数独算法实例
Jun 09 Python
Python函数式编程指南(四):生成器详解
Jun 24 Python
python制作花瓣网美女图片爬虫
Oct 28 Python
Python中pandas dataframe删除一行或一列:drop函数详解
Jul 03 Python
Python远程视频监控程序的实例代码
May 05 Python
Python接口开发实现步骤详解
Apr 26 Python
你应该知道的Python3.6、3.7、3.8新特性小结
May 12 Python
Python 如何批量更新已安装的库
May 26 Python
python如何写try语句
Jul 14 Python
windows下python 3.9 Numpy scipy和matlabplot的安装教程详解
Nov 28 Python
Python接口自动化测试框架运行原理及流程
Nov 30 Python
Python探索之URL Dispatcher实例详解
Oct 28 #Python
Python探索之Metaclass初步了解
Oct 28 #Python
Python编程之Re模块下的函数介绍
Oct 28 #Python
Python探索之静态方法和类方法的区别详解
Oct 27 #Python
Python探索之爬取电商售卖信息代码示例
Oct 27 #Python
Python 列表理解及使用方法
Oct 27 #Python
Python算法之求n个节点不同二叉树个数
Oct 27 #Python
You might like
PHP 面向对象详解
2012/09/13 PHP
PHP文件生成的图片无法使用CDN缓存的解决方法
2015/06/20 PHP
PHP面向对象程序设计实例分析
2016/01/26 PHP
PHP面向对象程序设计之类与反射API详解
2016/12/02 PHP
JQuery 拾色器插件发布-jquery.icolor.js
2010/10/20 Javascript
jQuery 一个图片切换的插件
2011/10/09 Javascript
javascript拖拽上传类库DropzoneJS使用方法
2013/12/05 Javascript
多引号嵌套的变量命名的问题
2014/05/09 Javascript
jQuery实现鼠标滚轮动态改变样式或效果
2015/01/05 Javascript
js计算德州扑克牌面值的方法
2015/03/04 Javascript
JavaScript中常见的字符串操作函数及用法汇总
2015/05/04 Javascript
JS日期格式化之javascript Date format
2015/10/01 Javascript
通过JS和PHP两种方法判断用户请求时使用的浏览器类型
2016/09/01 Javascript
AngularJS递归指令实现Tree View效果示例
2016/11/07 Javascript
浅析JS中的 map, filter, some, every, forEach, for in, for of 用法总结
2017/03/29 Javascript
微信小程序动态添加分享数据
2017/06/14 Javascript
JScript实现地址选择功能
2017/08/15 Javascript
从零开始搭建一个react项目开发
2018/02/09 Javascript
Vue CLI3 开启gzip压缩文件的方式
2018/09/30 Javascript
layer提示框添加多个按钮选择的实例
2019/09/12 Javascript
[01:00:12]2018DOTA2亚洲邀请赛 4.7 淘汰赛 VP vs LGD 第一场
2018/04/09 DOTA
[51:43]OG vs LGD 2018国际邀请赛淘汰赛BO3 第五场 8.26
2018/08/30 DOTA
利用信号如何监控Django模型对象字段值的变化详解
2017/11/27 Python
python实现TCP文件传输
2020/03/20 Python
Spring @Enable模块驱动原理及使用实例
2020/06/23 Python
HTML5 canvas基本绘图之绘制矩形
2016/06/27 HTML / CSS
请写出char *p与"零值"比较的if语句
2014/09/24 面试题
linux面试题参考答案(10)
2016/10/26 面试题
Java基础面试题
2012/11/02 面试题
令人啧啧称赞的经理推荐信
2013/11/07 职场文书
幼儿园家长评语大全
2014/04/16 职场文书
给校长的建议书300字
2014/05/16 职场文书
党的群众路线教育实践活动个人剖析材料
2014/10/07 职场文书
中学生社区服务活动报告
2015/02/05 职场文书
事业单位工作人员2015年度思想工作总结
2015/10/15 职场文书
MySQL创建管理KEY分区
2022/04/13 MySQL