我有一个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除外)。所以,有些事情是错的,我无法弄清楚如何解决问题。
答案 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
以获得所需的最小值。
但请注意,计算地理距离的计算速度可能很慢,因此您可以尝试忽略重复对。也就是说,如果您已经完成A
和B
,那么您无需为B
和A
计算它。这是一个代码版本,可以避免重复计算并直接返回最小距离的字典:
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)