Pandas探索之高性能函数eval和query解析
PythonDataAnalysisLibrary或pandas是基于NumPy的一种工具,该工具是为了解决数据分析任务而创建的。Pandas纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具。pandas提供了大量能使我们快速便捷地处理数据的函数和方法。你很快就会发现,它是使Python成为强大而高效的数据分析环境的重要因素之一。
相较于Python的内置函数,Pandas库为我们提供了一系列性能更高的数据处理函数,本节将向大家介绍Pandas库中的高性能函数eval与query:
在Python中,我们可以用很多种的方法来实现同样的目标,例如实现两个数组的相加:
importnumpyasnp rng=np.random.RandomState(42) x=rng.rand(1E6) y=rng.rand(1E6) %timeitx+y 100loops,bestof3:3.39msperloop
利用Numpy中的fromiter函数我们可以得到相同的一维数组,然而我们发现,这个语句的性能并不比内置的数组加法好。
%timeitnp.fromiter((xi+yiforxi,yiinzip(x,y)), dtype=x.dtype,count=len(x)) 1loop,bestof3:266msperloop
再比如,进行某一项条件的判断:
mask=(x>0.5)&(y<0.5) tmp1=(x>0.5) tmp2=(y<0.5) mask=tmp1&tmp2
Numpy库中的函数allclose用于判断两个数组是否相等,我们可以看到,使用numexpr库中的evaluate函数同样可以实现mask中的条件判断。
importnumexpr mask_numexpr=numexpr.evaluate('(x>0.5)&(y<0.5)') np.allclose(mask,mask_numexpr) True
面对同样的问题,Pandas库为我们提供了更高性能的解决方案,eval函数能够将特定形式的字符串转换为对应含义的逻辑判断或运算,比Python的内置函数具有更好的算法效率:
importpandasaspd nrows,ncols=100000,100 rng=np.random.RandomState(42) df1,df2,df3,df4=(pd.DataFrame(rng.rand(nrows,ncols)) foriinrange(4)) %timeitdf1+df2+df3+df4 10loops,bestof3:87.1msperloop %timeitpd.eval('df1+df2+df3+df4') 10loops,bestof3:42.2msperloop np.allclose(df1+df2+df3+df4, pd.eval('df1+df2+df3+df4')) True
可以看到,eval函数实现了等价的计算,并且具有更高的性能。除了加法运算,Pandas的函数eval还能帮助我们实现其他多种复杂的逻辑判断或计算:
以上就是本文关于Pandas探索之高性能函数eval和query解析的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站:Python探索之URLDispatcher实例详解、Python编程之Re模块下的函数介绍等,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!