找到数据框中每个点的最近点

时间:2017-11-24 00:19:37

标签: python coordinates nearest-neighbor geopy

我有一个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除外)。所以,有些事情是错的,我无法弄清楚如何解决问题。

1 个答案:

答案 0 :(得分:0)

您的代码未显示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)