代码之家  ›  专栏  ›  技术社区  ›  saurabh

熊猫数据框优化查询

  •  0
  • saurabh  · 技术社区  · 8 年前

    我有一个相当大的数据帧,有超过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)
    

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

    1 回复  |  直到 8 年前
        1
  •  1
  •   hilberts_drinking_problem    8 年前

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

    df.iloc[df.field3.searchsorted(min_v, 'left'):df.field3.searchsorted(max_v, 'right')]

    这个速度似乎是 df.query 在我的机器上有10万张唱片。

    如果您提前知道查询集,您可以做得更好。例如,假设有数组 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])