我在csv文件中有两列已导入到pandas dataframe中。第一列是纬度,第二列是经度。对于每个lat,long,我想找到列中所有其他坐标之间的距离,并返回最小距离的位置。
import pandas as pd
import numpy as np
import geopy.distance
from math import sin,cos,sqrt,atan2,radians
df=pd.read_csv('coordinates.csv')
R=6373.0
df['coords']=list(zip(df['lat'],df['long'])
df['coords2']=list(zip(df['lat'],df['long'])
因此,对于每个坐标,我希望能够找到列表中所有其他坐标的最小坐标,但下面的for循环只是给出了一个很长的距离列表,没有跟踪位置。
我有一个需要2分的距离函数:
def distance (p1, p2):
return (geopy.distance.vincenty(p1,p2).km)
dist=[]
for i in range(0,len(df.coords)):
for j in range(0,len(df.coords2)):
if df.coords[i] != df.coords2[j]:
x=distance2(df.coords[i],df.coords2[j])
dist.append(df.coords[i], x)
示例数据:
location lat long
0 34.159525 -82.381883
1 33.57112 -81.761782
2 32.965361 -81.248054
3 34.511574 -82.646487
想要输出:
location lat long closest_distance
0 34.159525 -82.381883 2
1 33.57112 -81.761782 3
2 32.965361 -81.248054 3
3 34.511574 -82.646487 0
答案 0 :(得分:1)
假设您定义的函数distance
适用于两个输入相同的时间(返回0
),则以下强制执行应该有效:
def foo(latlong, location=list(range(len(latlong))):
closest_distance = []
for i in latlong:
dist = list(map(lambda x: distance(i,x), latlong))
min = dist.sort()
closest_distance.append(location[dist.index(min[1])])
return closest_distance
latlong
是经度 - 元组元组的列表,location是您选择给出这些对的名称列表,从您的写入看起来就像简单的编号。