Pandas query() 过滤性能

Paw*_*rBI 6 pandas

我读过https://jakevdp.github.io/PythonDataScienceHandbook/03.12-performance-eval-and-query.html 使用 query() 进行数据帧过滤比仅使用带有 \'&\' 的条件来过滤数据更快。当然,使用 query() 时有一些限制。但我在数据帧上尝试了它,实际上执行速度明显慢了。为什么会这样?我缺少什么?什么时候应该使用query()?见下文:

\n\n
import pandas as pd\n\nimport numpy as np\n\n#create dataframe with 5 columns using random numbers \n\nrng = np.random.RandomState(42)\n\ndf = pd.DataFrame(rng.rand(1000, 5), columns=[\'A\', \'B\', \'C\', \'D\',\'E\'])\n\ndf2= round((df * 10),1)\n\n%timeit df3 = df2[(df2["A"] < 3) & (df2["B"]>2)]\n\n%timeit df4 = df2.query("A<3 and B>2") \n
Run Code Online (Sandbox Code Playgroud)\n\n

对于 df3 我得到: 1.06 ms \xc2\xb1 156 \xc2\xb5s 每个循环(意味着 \xc2\xb1 标准偏差 7 次运行,每次 1000 次循环)

\n\n

对于 df4:每次循环 1.97 ms \xc2\xb1 155 \xc2\xb5s(平均 \xc2\xb1 标准偏差 7 次运行,每次 1000 次循环)

\n\n

正如您所看到的,df4 花费了几乎两倍的时间。为什么???使用 query() 是否有限制?我发现 query() 语法更清晰、更易于使用,我希望默认使用它。

\n\n

我正在使用 Pandas 0.24.2

\n

Adr*_*ico 3

eval使用和时会产生一些开销query如用户指南文档中所示,对于较小的数据帧(大约 20k 行),使用纯 Python 操作速度更快。在这里,您的数据框只有 1k 行。

query对于您的具体示例,在我的带有 pandas 1.2.1 和 python 3.8 的机器上,当数据帧约为 1000 万行时,我会得到更快的结果。

然而,我认为query与其他过滤数据的方法相比,更多的是语法便利性而不是性能增强器(还有其他工具,例如 Dask、Numba、Modin、Vaex、rapid 等)。

具有 10**7 行的查询的更快结果的屏幕截图。

在此输入图像描述

文档截图