【问题标题】:Find the nearest point for each point in dataframe查找数据框中每个点的最近点
【发布时间】:2017-11-24 00:19:36
【问题描述】:

我有一个带有 ID、纬度和经度的数据框:

ID  Latitude   Longitude        coords
A    45.0353    52.5362   (45.0353, 52.5362)
B    24.6374    12.5363   (24.6374, 12.5363)
C    42.3539    21.O530   (42.3539, 21.O530)
D    48.3638    18.3903   (48.3638, 18.3903)

我需要为每个人找到最近的一个,距离将是所需数据框中的第五列。我尝试:

dicts1 = dict(zip(df.ID, df.coords))
dicts2 = dict(zip(df.ID, df.coords))

f_dict={}
for key, value in dicts1.iteritems():
    for k, v in dicts2.iteritems():
        lista.append(geopy.distance.vincenty(value, v).km)
        f_dict.update({key:lista})

我只得到了所有它们的一个距离,但此时我需要为它们中的每一个获取 len(data['ID']) 值,大约是 1500,所以 1500*1500,之后我需要采取最近,最低的距离(0除外)。所以,出了点问题,我不知道如何解决这个问题。

【问题讨论】:

    标签: python coordinates nearest-neighbor geopy


    【解决方案1】:

    您的代码未显示lista 的定义方式。如果您将 lista=[] 放在外部 for 循环的开头,那么它将为您提供您正在寻找的 1500*1500 值集。但是请注意,您不需要定义字典两次;相反,您可以对同一个字典进行两次迭代。此外,您可以在内循环完成后更新f_dict,而不是在每次迭代中更新它:

    dicts = dict(zip(df.ID, df.coords))
    
    f_dict={}
    for key, value in dicts.iteritems():
        lista = []
        for k, v in dicts.iteritems():
            lista.append(geopy.distance.vincenty(value, v).km)
        f_dict.update({key:lista})
    

    然后您必须遍历 f_dict 以获得所需的最小值。

    但请注意,计算地理距离的计算速度可能会很慢,因此您可以尝试忽略重复对。也就是说,如果您已经完成了AB,那么您不需要为BA 计算它。这是避免重复计算并直接返回具有最小距离的字典的代码版本:

    dicts = dict(zip(df.ID, df.coords))
    f_dict={}
    
    def update_distances(keys, distance):
        for k in keys:
            try:
                if distance < f_dict[k]:
                    f_dict.update({k:distance})
            except KeyError:
                f_dict.update({k:distance})
    
    for idx1, (key, value) in enumerate(dicts.iteritems()):
        for idx2, (k, v) in enumerate(dicts.iteritems()):
            if idx2 <= idx1:
                continue # Skip a repeated calculation of distance
            update_distances([key, k], geopy.distance.vincenty(value, v).km)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-16
      • 2017-03-05
      • 1970-01-01
      • 1970-01-01
      • 2021-07-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-24
      相关资源
      最近更新 更多