pandas 计算坐标间距离的最具资源效率的方法

7hiiyaii  于 2023-02-11  发布在  其他
关注(0)|答案(2)|浏览(154)

我试图找出所有位于坐标系100米范围内的观测值。
我有两个 Dataframe ,Dataframe1有400行坐标,对于每一行,我需要找到Dataframe2中位于该位置100米范围内的所有观测值,并对它们进行计数。
两个 Dataframe 的格式如下:

| Y    | X    |  observations_within100m  |
|:----:|:----:|:-------------------------:|
|100   |100   |          22               |
|110   |105   |          25               |
|110   |102   |          11               |

我正在寻找最有效的方法来完成这个计算,因为dataframe2有超过200000个居住地,我知道它可以通过应用一个距离函数和一个for循环来完成,但是我想知道这里最好的方法是什么。

uujelgoq

uujelgoq1#

除了我的评论,一个肮脏的快速方法,比for循环好得多,就是找到df1中每个X,Y给定的中心形成的圆中的点。
你可以试试这个:

distance = 100
df1['num_observations'] = df1.apply(
    lambda row: len(
        df2[(df2.X.sub(row.X) ** 2 + df2.Y.sub(row.Y) ** 2).le(distance**2)]
    ),
    axis=1,
)

您可以看到,位于所需距离处的点必须遵守方程(x-x1)^2 + (y-y1)^2 <= distance^2
当然,有几个优化,你可以应用在这之上,像你不需要搜索整个df2,但只有它的某一部分等。

mitkmikd

mitkmikd2#

如果你正在处理的区域很小,你可以把所有已知的位置做成一个网格,然后为每个点预先计算一个列表,列出df 1中距离该点100米以内的条目。
步骤2将遍历200 k行df 2,并且相应地增加在该点处找到的df 1条目的计数。
否则,这个问题就类似于碰撞检测,可能会有智能的实现。例如pygame就有一个,但不知道有多高效。根据区域的稀疏程度,通过将其划分为单元格可能会有好处,所以你只需要检测该单元格中条目的碰撞/距离,从400个对象减少到200 k中的每一个。
希望答案是有帮助的,祝你好运!

相关问题