Python 数据帧优化查询
我有一个相当大的数据框,有超过100000条记录。我需要在此数据帧的数字字段上重复执行范围搜索。我能够使用loc或query执行此搜索,但这需要很多时间。我认为原因是现在这是一次暴力搜查。有没有办法在这个数字字段上生成索引,这样我就可以在这个字段上进行更好的优化范围搜索 样本数据帧-Python 数据帧优化查询,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个相当大的数据框,有超过100000条记录。我需要在此数据帧的数字字段上重复执行范围搜索。我能够使用loc或query执行此搜索,但这需要很多时间。我认为原因是现在这是一次暴力搜查。有没有办法在这个数字字段上生成索引,这样我就可以在这个字段上进行更好的优化范围搜索 样本数据帧- field1 field2 field3 red car 1000000000 green truck 2000000000 yellow bus 300
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我想先对它进行排序,但是查询怎么知道使用排序呢?它仍将遍历所有记录,性能将保持不变,除非我可以在此字段上创建某种辅助索引。正确的?