有效地确定哪些网格正方形观测值应属于

时间:2019-01-09 17:22:51

标签: python performance

我有以下带有x和y定义的bin的网格,每个网格正方形都有一个唯一的id

mapping = pd.DataFrame({'id': [1,2,3,4,5,6,7,8,9], 'x': [1,1,1,2,2,2,3,3,3], 'y': [1,2,3,1,2,3,1,2,3]})

   id  x  y
0   1  1  1
1   2  1  2
2   3  1  3
3   4  2  1
4   5  2  2
5   6  2  3
6   7  3  1
7   8  3  2
8   9  3  3

我还有一个新的观测数据框,我想知道它们的关联ID应该是什么(例如,它们属于哪个网格正方形)

coordinates = pd.DataFrame({'x': [1.4, 2.7], 'y': [1.9, 1.1]})

     x    y
0  1.4  1.9
1  2.7  1.1

我的解决方案是以下功能:

import bisect
def get_id(coords, mapping):

    x_val = mapping.x[bisect.bisect_right(mapping.x, coords[0]) - 1]
    y_val = mapping.y[bisect.bisect_right(mapping.y, coords[1]) - 1]
    id = mapping[(mapping.x == x_val) & (mapping.y == y_val)].iloc[0, 0]
    return id


coordinates.apply(get_id, mapping = mapping, axis = 1)

Out[21]: 
0    1
1    4
dtype: int64

这有效,但随着坐标数据帧的增长而变慢。我敢肯定,对于具有10 ^ 6 +观测值的坐标数据框,有一种快速的方法。有更快的方法吗?

编辑: 要从以下评论中回答@ abdurrehman245问题。 我当前的方法是简单地四舍五入任何数据点,这使我可以使用包含任何给定ID的最小值条目(箱)的映射数据框将其映射到ID。因此,x=1.4 y=1.9舍入到x=1 y=1,它根据id=1映射到mapping

也许这种笛卡尔可视化使这一点更加清晰:

    Y
  4 -------------------------
    |   3   |   6   |   9   |
    |       |       |       |
  3 -------------------------
    |   2   |   5   |   8   |
    |       |       |       |
  2 -------------------------
    |   1   |   4   |   7   |
    |       |       |       |
  1 -------------------------  X
    1       2       3       4

我还要补充一点,我不能使用floor函数,因为bin不一定是本例中的整数。

0 个答案:

没有答案