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