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 时间操作例子和时间格式化参数小结
Apr 24 Python
跟老齐学Python之dict()的操作方法
Sep 24 Python
用Python编写一个国际象棋AI程序
Nov 28 Python
hmac模块生成加入了密钥的消息摘要详解
Jan 11 Python
python之从文件读取数据到list的实例讲解
Apr 19 Python
Python正则表达式和元字符详解
Nov 29 Python
Python除法之传统除法、Floor除法及真除法实例详解
May 23 Python
python库matplotlib绘制坐标图
Oct 18 Python
Python3 把一个列表按指定数目分成多个列表的方式
Dec 25 Python
Python 一行代码能实现丧心病狂的功能
Jan 18 Python
Python下划线5种含义代码实例解析
Jul 10 Python
pandas抽取行列数据的几种方法
Dec 13 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中使用preg_match_all匹配文章中的图片
2013/02/06 PHP
php jsonp单引号转义
2014/11/23 PHP
PHP抓取淘宝商品的用户晒单评论+图片+搜索商品列表实例
2016/04/14 PHP
yii2控制器Controller Ajax操作示例
2016/07/23 PHP
用PHP的socket实现客户端到服务端的通信实例详解
2017/02/04 PHP
PDO::_construct讲解
2019/01/27 PHP
JavaScript DOM学习第一章 W3C DOM简介
2010/02/19 Javascript
javascript同页面多次调用弹出层具体实例代码
2013/08/16 Javascript
模拟jQuery中的ready方法及实现按需加载css,js实例代码
2013/09/27 Javascript
jQuery超酷平面式时钟效果代码分享
2020/03/30 Javascript
省市联动效果的简单实现代码(推荐)
2016/06/06 Javascript
AngularJS基础 ng-non-bindable 指令详细介绍
2016/08/02 Javascript
jquery将标签元素的高设为屏幕的百分比
2017/04/19 jQuery
jquery+css实现侧边导航栏效果
2017/06/12 jQuery
Vue.js项目中管理每个页面的头部标签的两种方法
2018/06/25 Javascript
nodejs使用async模块同步执行的方法
2019/03/02 NodeJs
微信小程序分包加载代码实现方法详解
2019/09/23 Javascript
node.js中 redis 的安装和基本操作示例
2020/02/10 Javascript
vue-iview动态新增和删除的方法
2020/06/17 Javascript
Python实现的多线程http压力测试代码
2017/02/08 Python
Python中单、双下划线的区别总结
2017/12/01 Python
tensorflow学习笔记之mnist的卷积神经网络实例
2018/04/15 Python
python实现维吉尼亚算法
2019/03/20 Python
py-charm延长试用期限实例
2019/12/22 Python
基于FME使用Python过程图解
2020/05/13 Python
python求解汉诺塔游戏
2020/07/09 Python
python爬虫快速响应服务器的做法
2020/11/24 Python
深入解析HTML5中的Blob对象的使用
2015/09/08 HTML / CSS
新东网科技Java笔试题
2012/07/13 面试题
远程网络教育毕业生自我鉴定
2014/04/14 职场文书
2014年纪检部工作总结
2014/11/12 职场文书
golang正则之命名分组方式
2021/04/25 Golang
Python基础之进程详解
2021/05/21 Python
python字符串的多行输出的实例详解
2021/06/08 Python
Django框架中模型的用法
2022/06/10 Python
Windows Server 修改远程桌面端口的实现
2022/06/25 Servers