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

时间:2013-02-06 08:08:24

标签: python pandas

我想在网络应用程序中使用像SQL这样的pandas(而不是将数据保存在pSQL中,只需将其保存在pandas DataFrame中,因为数据不到1GB并且不会不断变化)。如果我根据列上的多个过滤器进行查找(例如,年龄> x,年龄< y,收入> p,收入< q)是否有任何方法可以加快此过滤?或者它已经在下面完成了。在SQL中,我们会声明一个关于年龄和收入的索引来加速这样的查询,我想知道如果有的话,大熊猫的做法是什么。

2 个答案:

答案 0 :(得分:4)

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

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

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

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

答案 1 :(得分:2)

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的开销,无法为你的&#34;过滤&#34;结果,你不会有副本本身引起的内存开销。 (实际上,这不完全正确,因为面具必须存储在某处,但您仍然不必将表复制到内存中的其他位置)

然而,这需要付出代价:屏蔽数组需要更长的时间才能使用,因为进程必须检查内存中的每个值是否都被屏蔽。但是,如果这仅仅是过滤&#34;那么这个特定的访问开销应该是不明显的(当人们想要使用被屏蔽的数组进行计算时,这变得非常重要。)

修改

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