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中random模块用法实例分析
May 19 Python
图文详解WinPE下安装Python
May 17 Python
python 打印对象的所有属性值的方法
Sep 11 Python
python 编写简单网页服务器的实例
Jun 01 Python
Python测试网络连通性示例【基于ping】
Aug 03 Python
解决python selenium3启动不了firefox的问题
Oct 13 Python
Python中logging实例讲解
Jan 17 Python
python导包的几种方法(自定义包的生成以及导入详解)
Jul 15 Python
开启Django博客的RSS功能的实现方法
Feb 17 Python
用什么库写 Python 命令行程序(示例代码详解)
Feb 20 Python
5款实用的python 工具推荐
Oct 13 Python
python脚本框架webpy的url映射详解
Nov 20 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 fsockopen写的HTTP下载的类
2007/02/22 PHP
使用php测试硬盘写入速度示例
2014/01/27 PHP
php输入数据统一类实例
2015/02/23 PHP
TP5框架model常见操作示例小结【增删改查、聚合、时间戳、软删除等】
2020/04/05 PHP
jquery获取选中的文本和值的方法
2014/07/08 Javascript
对比分析AngularJS中的$http.post与jQuery.post的区别
2015/02/27 Javascript
JS未跨域操作iframe里的DOM
2016/06/01 Javascript
前端程序员必须知道的高性能Javascript知识
2016/08/24 Javascript
JavaScript 身份证号有效验证详解及实例代码
2016/10/20 Javascript
Javascript中字符串replace方法的第二个参数探究
2016/12/05 Javascript
jQuery插件HighCharts绘制简单2D柱状图效果示例【附demo源码】
2017/03/21 jQuery
使用jQuery实现动态添加小广告
2017/07/11 jQuery
浅谈JsonObject中的key-value数据解析排序问题
2017/12/06 Javascript
详解React native fetch遇到的坑
2018/08/30 Javascript
layui实现三级联动效果
2019/07/26 Javascript
TypeScript中使用getElementXXX()的示例代码
2019/09/12 Javascript
js原生map实现的方法总结
2020/01/19 Javascript
原生javascript的ajax请求及后台PHP响应操作示例
2020/02/24 Javascript
[01:01:04]2018DOTA2亚洲邀请赛 4.5 淘汰赛 OpTic vs TNC 第一场
2018/04/06 DOTA
python client使用http post 到server端的代码
2013/02/10 Python
python实现爬虫下载美女图片
2015/07/14 Python
深入理解python中的闭包和装饰器
2016/06/12 Python
Sublime开发python程序的示例代码
2018/01/24 Python
Python3.5.3下配置opencv3.2.0的操作方法
2018/04/02 Python
使用Flask集成bootstrap的方法
2018/07/24 Python
python中正则表达式 re.findall 用法
2018/10/23 Python
Django的用户模块与权限系统的示例代码
2019/07/24 Python
Django自定义列表 models字段显示方式
2020/04/03 Python
input元素的url类型和email类型简介
2012/07/11 HTML / CSS
html5 利用重力感应实现摇一摇换颜色可用来做抽奖等等
2014/05/07 HTML / CSS
运动会广播稿150字(9篇)
2014/09/20 职场文书
学校党支部承诺书
2015/04/30 职场文书
主持人大赛开场白
2015/05/29 职场文书
《自然之道》读后感3篇
2019/12/17 职场文书
python 模拟在天空中放风筝的示例代码
2021/04/21 Python
python入门之算法学习
2021/04/22 Python