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自动化测试工具Splinter简介和使用实例
May 13 Python
用Python编写分析Python程序性能的工具的教程
Apr 01 Python
Python 迭代器工具包【推荐】
May 06 Python
简单谈谈Python中的元祖(Tuple)和字典(Dict)
Apr 21 Python
Request的中断和ErrorHandler实例解析
Feb 12 Python
python 多维切片之冒号和三个点的用法介绍
Apr 19 Python
基于DATAFRAME中元素的读取与修改方法
Jun 08 Python
Python Django Cookie 简单用法解析
Aug 13 Python
python异常处理和日志处理方式
Dec 24 Python
基于python图书馆管理系统设计实例详解
Aug 05 Python
python exit出错原因整理
Aug 31 Python
python 实现音频叠加的示例
Oct 29 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 strstr查找字符串中是否包含某些字符的查找函数
2010/06/03 PHP
thinkphp 一个页面使用2次分页的实现方法
2013/07/15 PHP
yii2整合百度编辑器umeditor及umeditor图片上传问题的解决办法
2016/04/20 PHP
php mysql_real_escape_string addslashes及mysql绑定参数防SQL注入攻击
2016/12/23 PHP
php+js实现的无刷新下载文件功能示例
2019/08/23 PHP
javascript实现tabs选项卡切换效果(扩展版)
2013/03/19 Javascript
页面刷新时记住滚动条的位置jquery代码
2014/06/17 Javascript
jQuery+php实时获取及响应文本框输入内容的方法
2016/05/24 Javascript
详解BootStrap中Affix控件的使用及保持布局的美观的方法
2016/07/08 Javascript
angular.js之路由的选择方法
2016/09/24 Javascript
分享javascript、jquery实用代码段
2016/10/20 Javascript
JS常见简单正则表达式验证功能小结【手机,地址,企业税号,金额,身份证等】
2017/01/22 Javascript
AngularJS+Bootstrap3多级导航菜单的实现代码
2017/08/16 Javascript
详解如何解决vue开发请求数据跨域的问题(基于浏览器的配置解决)
2018/11/12 Javascript
如何优雅地在vue中添加权限控制示例详解
2019/03/07 Javascript
浅谈Webpack4 Tree Shaking 终极优化指南
2019/11/18 Javascript
JS实现页面鼠标点击出现图片特效
2020/08/19 Javascript
python类的方法属性与方法属性的动态绑定代码详解
2017/12/27 Python
浅谈Python中的私有变量
2018/02/28 Python
Python判断两个list是否是父子集关系的实例
2018/05/04 Python
python3使用SMTP发送HTML格式邮件
2018/06/19 Python
python2.x实现人民币转大写人民币
2018/06/20 Python
Python3enumrate和range对比及示例详解
2019/07/13 Python
python pillow库的基础使用教程
2021/01/13 Python
CSS3动画animation实现云彩向左滚动
2014/05/09 HTML / CSS
找到不普通的东西:Bonanza
2016/10/20 全球购物
奥斯汀独木舟和皮划艇:Austin Canoe & Kayak
2018/05/22 全球购物
西班牙在线光学:Visual-Click
2020/06/22 全球购物
网络编程中设计并发服务器,使用多进程与多线程,请问有什么区别?
2016/03/27 面试题
采购部岗位职责
2013/11/24 职场文书
宿舍卫生检讨书
2014/01/16 职场文书
幼儿园家长评语
2014/02/10 职场文书
法律意见书范本
2015/06/04 职场文书
深度学习详解之初试机器学习
2021/04/14 Python
Python 中 Shutil 模块详情
2021/11/11 Python
Vue elementUI表单嵌套表格并对每行进行校验详解
2022/02/18 Vue.js