Python 数据帧优化查询

Python 数据帧优化查询,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个相当大的数据框,有超过100000条记录。我需要在此数据帧的数字字段上重复执行范围搜索。我能够使用loc或query执行此搜索,但这需要很多时间。我认为原因是现在这是一次暴力搜查。有没有办法在这个数字字段上生成索引,这样我就可以在这个字段上进行更好的优化范围搜索 样本数据帧- field1 field2 field3 red car 1000000000 green truck 2000000000 yellow bus 300

我有一个相当大的数据框,有超过100000条记录。我需要在此数据帧的数字字段上重复执行范围搜索。我能够使用loc或query执行此搜索,但这需要很多时间。我认为原因是现在这是一次暴力搜查。有没有办法在这个数字字段上生成索引,这样我就可以在这个字段上进行更好的优化范围搜索

样本数据帧-

field1   field2   field3
red        car     1000000000
green      truck   2000000000
yellow     bus     3000000000
white      bike    4000000000
black      cycle   5000000000
搜索-

dataframe.query(field3 > 1000000000 & field3 < 5000000000)
dataframe.query(field3>100000000&field3<5000000000)

我在for循环中使用这个查询,该循环运行了大约6000次。我的全部代码大约需要25分钟。从150毫秒开始,调用此部件6000次将是900秒,即15分钟。如果我能在这个字段上创建一个索引,那么我认为查询时间会大大缩短。

一种方法是对数字列进行排序,然后使用searchsorted+iloc。例如

df.iloc[df.field3.searchsorted(最小值为“左”):df.field3.searchsorted(最大值为“右”)]

这似乎是
df的8倍。在我的机器上查询
,有100k条记录

如果您提前知道查询集,您可以做得更好。例如,假设您有数组
mins
maxs
,其中
len(mins)==len(maxs)==6000
。你可以预先计算

min_ix = df.field3.searchsorted(mins, 'left')
max_ix = df.field3.searchsorted(maxs, 'right')
并通过

for i, j in zip(min_ix, max_ix):
    print(df.iloc[i:j])

查询是否总是选择间隔?或者这只是一个示例?您是否尝试先对其排序,然后再查询?您能否澄清“长时间”是什么?100000条记录是一个相当小的数据帧,在500000条记录版本的数据帧上,每次查询的结果约为150ms。@YakymPirozhenko,我在for循环中反复使用相同的查询。它总是一个选择间隔的查询。@HarvIpan我想先对它进行排序,但是查询怎么知道使用排序呢?它仍将遍历所有记录,性能将保持不变,除非我可以在此字段上创建某种辅助索引。正确的?