如何通过列值加速大型Pandas dataframe的行选择

5

我有一个大型的数字Pandas数据框df,我想选择出某一列值在min_valuemax_value范围内的行。

我可以通过以下方式实现:

filtered_df = df[(df[col_name].values >= min_value) & (df[col_name].values <= max_value)]

我正在寻找加速方法。我尝试了以下方法:

df.sort(col_name, inplace=True)
left_idx = np.searchsorted(df[col_name].values, min_value, side='left')
right_idx = np.searchsorted(df[col_name].values, max_value, side='right')
filtered_df = df[left_idx:right_idx]

但是对于df.sort()来说,它不能起到加速选择的作用。有什么技巧可以加快选择速度吗?(Pandas 0.11)

您最初的查询可以重写为filtered_df = df[(df[col_name] >= min_value) & (df[col_name] <= max_value)],我认为这是正确的方法。它应该在线性(O(N))时间内运行,而排序通常需要O(N*logN)的时间。另一方面,如果您需要多次进行此类选择,则可以仅对其进行一次排序,然后使用已排序的DF进行选择。 - Roman Pekar
1
@RomanPekar:我认为通过.values会更快,因为没有索引开销。 - DSM
@DSM 谢谢,这就是我没有添加答案的原因 :) 我仍在学习有关pandas / numpy的知识。您认为有加速OP任务的方法吗? - Roman Pekar
我原本希望新的.query功能可以实现,但似乎并不行。希望Jeff或Andy能提供一些建议。 - DSM
@bibgug,你能发一下索引长什么样子吗?还有df.info()的结果?这台机器的内存很大吗? - Jeff
显示剩余7条评论
1个回答

6
我认为最好使用numexpr来加速这个过程。
import pandas as pd
import numpy as np
import numexpr as ne

data = np.random.normal(size=100000000)
df = pd.DataFrame(data=data, columns=['col'])
a = df['col']
min_val = a.min()
max_val = a.max()
expr = '(a >= min_val) & (a <= max_val)'

并且计时...

%timeit eval(expr)
1 loops, best of 3: 668 ms per loop

%timeit ne.evaluate(expr)
1 loops, best of 3: 197 ms per loop

1
这就是 df.query(在0.13中)应该在底层执行的操作 :) - Andy Hayden
所以我猜“升级”会是更好的答案。 - JaminSore

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接