在其他数据帧中查找最近的点(有很多数据)

问题描述 投票:0回答:1

问题很简单,我有两个DataFrame:

  • 一个拥有9万套公寓的公寓及其纬度/经度

  • 和一家拥有3000家药房的商店及其经度/纬度

而且我想为我所有的公寓创建一个新变量:'最近药房的距离'

为此,我尝试了两种方法花费很多时间

[First method:我创建了一个矩阵,其中我的公寓排成一行,我的药房成列,在相交处之间的距离,之后我只取矩阵的最小值,得到一个列向量为90 000值

我只对numpy使用double:

m,n=len(result['latitude']),len(pharma['lat'])
M = np.ones((m,n))
for i in range(m):
     for j in range(n):
        if (result['Code departement'][i]==pharma['departement'][j]):
            M[i,j] =(pharma['lat'][j]-result['latitude'][i])**2+(pharma['lng'][j]-result['longitude'] [i])**2

ps:我知道纬度/经度的公式错误,但公寓位于同一区域,因此是很好的替代方法

第二种方法:我使用了本主题的解决方案(它们是相同的问题,但数据较少)https://gis.stackexchange.com/questions/222315/geopandas-find-nearest-point-in-other-dataframe

我使用了geopandas等最接近的方法:

from shapely.ops import nearest_points
pts3 = pharma.geometry.unary_union


def near(point, pts=pts3):
     nearest = pharma.geometry == nearest_points(point, pts)[1]
     return pharma[nearest].geometry.get_values()[0]

appart['Nearest'] = appart.apply(lambda row: near(row.geometry), axis=1)

而且正如我所说,这两种方法都花费太多时间,在运行我的PC /笔记本电脑一小时后崩溃了,它失败了。

我最后的问题:

您有优化的方法来加快速度吗?有可能的 ?如果已经进行了优化,我将购买另一台PC,但要使PC具备如此快速计算能力的条件是什么?

问题很简单,我有两个DataFrame:一个带有90 000套公寓及其纬度/经度,一个带有3000个药房及其纬度/经度,我想为...创建一个新变量...

python pandas optimization nearest-neighbor geopandas
1个回答
0
投票
我想Ball Tree是适合此任务的结构。

您可以使用scikit-learn实现,有关适合您的情况的示例,请参见下面的代码:

© www.soinside.com 2019 - 2024. All rights reserved.