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 07 Python
python之Socket网络编程详解
Sep 29 Python
利用Python找出序列中出现最多的元素示例代码
Dec 08 Python
Django实现表单验证
Sep 08 Python
PyQt5 在label显示的图片中绘制矩形的方法
Jun 17 Python
python 进程 进程池 进程间通信实现解析
Aug 23 Python
Python3 A*寻路算法实现方式
Dec 24 Python
python实现飞行棋游戏
Feb 05 Python
python使用正则表达式去除中文文本多余空格,保留英文之间空格方法详解
Feb 11 Python
Python运行提示缺少模块问题解决方案
Apr 02 Python
详解python实现可视化的MD5、sha256哈希加密小工具
Sep 14 Python
Python类成员继承重写的实现
Sep 16 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
wiki-shan写的php在线加密的解密程序
2008/09/07 PHP
PHP 编程安全性小结
2010/01/08 PHP
基于PHP的cURL快速入门教程 (小偷采集程序)
2011/06/02 PHP
php截取字符串函数substr,iconv_substr,mb_substr示例以及优劣分析
2014/06/10 PHP
php中实现获取随机数组列表的自定义函数
2015/04/02 PHP
基于laravel where的高级使用方法
2019/10/10 PHP
yii框架数据库关联查询操作示例
2019/10/14 PHP
HTML中不支持静态Expando的元素的问题
2007/03/08 Javascript
用javascript获取当页面上鼠标光标位置和触发事件的对象的代码
2009/12/09 Javascript
javascript用函数实现对象的方法
2015/05/14 Javascript
JavaScript中的条件判断语句使用详解
2015/06/03 Javascript
IE8 内存泄露(内存一直增长 )的原因及解决办法
2016/04/06 Javascript
js表单元素checked、radio被选中的几种方法(详解)
2016/08/22 Javascript
基于jQuery实现左侧菜单栏可折叠功能
2016/12/27 Javascript
又一款MVVM组件 构建自己的Vue组件(2)
2017/03/13 Javascript
jQuery中map函数的两种方式
2017/04/07 jQuery
vue init webpack myproject构建项目 ip不能访问的解决方法
2018/03/20 Javascript
javascript中undefined的本质解析
2019/07/31 Javascript
Vue实现将数据库中带html标签的内容输出(原始HTML(Raw HTML))
2019/10/28 Javascript
Node.js学习之内置模块fs用法示例
2020/01/22 Javascript
vue路由的配置和页面切换详解
2020/09/09 Javascript
[00:28]DOTA2北京网鱼队选拔赛
2015/04/08 DOTA
Python中编写ORM框架的入门指引
2015/04/29 Python
Python的爬虫框架scrapy用21行代码写一个爬虫
2017/04/24 Python
python 根据时间来生成唯一的字符串方法
2019/01/14 Python
python找出因数与质因数的方法
2019/07/25 Python
Python IDE Pycharm中的快捷键列表用法
2019/08/08 Python
Python语法之精妙的十个知识点(装B语法)
2020/01/18 Python
pytorch中 gpu与gpu、gpu与cpu 在load时相互转化操作
2020/05/25 Python
使用pandas实现筛选出指定列值所对应的行
2020/12/13 Python
欧洲领先的技术商店:eibmarkt.com
2019/05/10 全球购物
为什么Runtime.exec(“ls”)没有任何输出?
2014/10/03 面试题
工商企业管理应届生求职信
2013/11/03 职场文书
采购主管的岗位职责
2013/12/17 职场文书
雏鹰争章活动总结
2014/05/09 职场文书
2015教师年度工作总结范文
2015/04/07 职场文书