4

我想将 Pandas 之类的 SQL 用于 Web 应用程序(而不是将数据保存在 pSQL 中,只需将其保存在 pandas DataFrame 中,因为数据不到 1GB 并且不会不断变化)。如果我基于列上的多个过滤器进行查找(例如,年龄 > x、年龄 < y、收入 > p、收入 < q),有什么方法可以加快过滤速度吗?还是已经在下面完成了。在 SQL 中,一个人会声明一个关于年龄和收入的索引来加速这样的查询,我想知道如果有的话,pandas 的做法是什么。

4

2 回答 2

6

执行此查询的“熊猫方式”是:

df[(x < df.age) & (df.age < y) & (p < df.income) & (df.income < q)]

pandas 默认索引所有内容(包括所有列),因此您无需事先明确声明要查询的内容。

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

于 2013-02-06T08:53:50.390 回答
3

Pandas 实际上只是一个包装器numpy.ndarray

所有搜索实际上都是使用ndarray内部完成的。

 df[(df.age > x) & (y < df.age) & (df.income > p) & (df.income < q)]

应该做的伎俩。numpy.ndarray但是您可以通过直接使用或使用掩码数组来加快该过程:http: //docs.scipy.org/doc/numpy/reference/maskedarray.html

这些不会为您新生成的数组分配新内存。这意味着您没有时间/CPU 开销来为“过滤”结果查找和分配新内存,并且您不会有由副本本身引起的内存开销。(实际上,这并不完全正确,因为掩码必须存储在某个地方,但您仍然不必将表复制到内存中的其他地方)

然而,这是有代价的:屏蔽数组的使用时间要长一些,因为进程必须检查内存中的每个值是否被屏蔽。但是,如果这只是为了“过滤”,那么这种特定的访问开销应该是不明显的(当人们想要使用掩码数组进行计算时,它变得非常重要)。

编辑:

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

于 2013-02-06T09:17:12.417 回答