Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 熊猫:通过创建索引来加速过滤?_Python_Pandas - Fatal编程技术网

Python 熊猫:通过创建索引来加速过滤?

Python 熊猫:通过创建索引来加速过滤?,python,pandas,Python,Pandas,我想在web应用程序中使用pandas-like SQL(而不是将数据保存在pSQL中,只需将其保存在pandas数据框中,因为数据略低于1GB,并且不会不断变化)。如果我正在基于列上的多个过滤器(例如年龄>x、年龄p、收入

我想在web应用程序中使用pandas-like SQL(而不是将数据保存在pSQL中,只需将其保存在pandas数据框中,因为数据略低于1GB,并且不会不断变化)。如果我正在基于列上的多个过滤器(例如年龄>x、年龄p、收入执行此查询的“pandas方式”是:

df[(x < df.age) & (df.age < y) & (p < df.income) & (df.income < q)]
df[(x
默认情况下,pandas索引所有内容(包括所有列),因此无需事先明确声明要查询的内容


(我不能说这种设置对您的数据集是否有意义。)

熊猫实际上只是
numpy.ndarray
的包装

所有搜索实际上都是使用
ndarray
internal完成的

 df[(df.age > x) & (y < df.age) & (df.income > p) & (df.income < q)]
df[(df.age>x)和(yp)和(df.income
我们应该做到这一点。但是,您可以直接使用
numpy.ndarray
或使用掩码数组来加快进程:

它们不会为新生成的阵列分配新内存。这意味着您没有为“筛选”结果查找和分配新内存所需的时间/CPU开销,也没有拷贝本身所导致的内存开销。(实际上,这并不完全正确,因为掩码必须存储在某个位置,但您仍然不必将表值复制到内存中的其他位置)

然而,这是有代价的:由于进程必须检查内存中的每个值是否都被屏蔽,所以使用屏蔽数组的时间要长一点。然而,如果这只是为了“过滤”,那么这个特定的访问开销应该是不可察觉的(当需要使用屏蔽数组进行计算时,它变得非常重要)

编辑:


对于磁盘和内存中的持久和优化数据访问,有这样优化的PyTables。也就是说,Pytables以及Numpy/Pandas都不被认为是这样使用的。

您目前是如何做到这一点的?“Pandas默认为所有内容编制索引的”-这就是我要找的!。我现在已经在像您所展示的那样做了,我看到一个有10万行的数据集大约需要30毫秒的时间,我想知道这是最快的,还是我可以使用SQL并让它运行得更快。@jason您尝试过SQL计时吗?我希望pandas的速度快得多(一方面它在内存中——尽管这意味着数据不是持久的,这是使用db的一个好处),我现在手头没有SQL设置可以测试,我计划在准备好后测试它。但正如您所说,如果内存中的全索引数据结构比SQL慢,我会非常惊讶。数据是只读的,所以我不需要持久性。@AndyHayden:你有“熊猫默认索引所有内容”的源吗?我在文档中找不到任何与此相关的内容。我很想了解更多信息。@Xochipill是的,我想我是说错了,我会更新这个答案假设我查询的是100K行数据,在应用上述4个过滤器后,结果显示它只有100行结果集,那么这个副本可以忽略不计(否?)-此外,我需要将该数据返回给消费者,所以我不会通过复制来获得任何好处(不是吗?)你是对的:在你的情况下,复制不会带来太多的开销。所以你可以忽略这一点。