Python 3.x 如何使用数据帧中的纬度和经度计算距离?

Python 3.x 如何使用数据帧中的纬度和经度计算距离?,python-3.x,pandas,geolocation,latitude-longitude,Python 3.x,Pandas,Geolocation,Latitude Longitude,我有一个数据框,它有两列纬度和经度,以及863行,因此每行都有一个由纬度和经度定义的点坐标。现在我想计算所有行之间的距离,单位为公里。我使用下面的参考链接来获得纬度和经度对之间的距离。如果有几行,我就可以使用参考链接了。但是我有很多行,我想我需要一个循环来实现问题的解决方案。因为我是python新手,所以无法创建循环此想法的逻辑 参考链接: 我的数据框如下所示: read_randomly_generated_lat_lon.head(3) Lat Lon 43.937845

我有一个数据框,它有两列纬度和经度,以及863行,因此每行都有一个由纬度和经度定义的点坐标。现在我想计算所有行之间的距离,单位为公里。我使用下面的参考链接来获得纬度和经度对之间的距离。如果有几行,我就可以使用参考链接了。但是我有很多行,我想我需要一个循环来实现问题的解决方案。因为我是python新手,所以无法创建循环此想法的逻辑

参考链接:

我的数据框如下所示:

read_randomly_generated_lat_lon.head(3)
Lat          Lon
43.937845   -97.905537
44.310739   -97.588820
44.914698   -99.003517

您可以使用scikit了解:

import numpy as np
from sklearn.neighbors import DistanceMetric

dfr = df.copy()
dfr.Lat = np.radians(df.Lat)
dfr.Lon = np.radians(df.Lon)
hs = DistanceMetric.get_metric("haversine")
(hs.pairwise(dfr)*6371) # Earth radius in km
输出:

array([[  0.        ,  48.56264446, 139.2836099 ],
       [ 48.56264446,   0.        , 130.57312786],
       [139.2836099 , 130.57312786,   0.        ]])
注意,输出是一个方阵,其中元素(i,j)是行i和行j之间的距离


这似乎比使用scipy的pdist和自定义的haversine函数要快。请注意:下面的脚本没有考虑地球的曲率。有许多文件解释了这个问题

但是,坐标之间的距离可以粗略确定。导出是一个系列,可以轻松地将其与原始的
df
连接起来,以提供一个单独的
显示相对于坐标的距离

d = ({
    'Lat' : [43.937845,44.310739,44.914698],       
    'Long' : [-97.905537,-97.588820,-99.003517],                               
     })

df = pd.DataFrame(d)

df = df[['Lat','Long']]

point1 = df.iloc[0]

def to_xy(point):

    r = 6371000 #radians of the earth (m)
    lam,phi = point
    cos_phi_0 = np.cos(np.radians(phi))

    return (r * np.radians(lam) * cos_phi_0, 
            r * np.radians(phi))

point1_xy = to_xy(point1)

df['to_xy'] = df.apply(lambda x: 
         tuple(x.values),
         axis=1).map(to_xy)

df['Y'], df['X'] = df.to_xy.str[0], df.to_xy.str[1]

df = df[['X','Y']] 
df = df.diff()

dist = np.sqrt(df['X']**2 + df['Y']**2)

#Convert to km
dist = dist/1000

print(dist)

0           NaN
1     41.149537
2    204.640462

为我们提供创建数据帧一部分的代码将非常有用,以便能够帮助解决您遇到的特定问题。@VasilisD谢谢。我现在编辑了我的问题。谢谢。由于您有863行,是否要计算所有距离对,即863*862/2值?如果是的话,你想要哪种格式的输出,矩阵还是…?这是正确的。如果我能在一个新的列中存储距离,那就太好了。这没有意义。每个
Lat
Lon
组合都是一个点。因此,您必须将某些行与其他行进行比较,以计算距离。您无法计算Lat和Lon之间的距离。因此,在这种情况下,
43.937845-97.905537
44.310739-97.588820
之间的距离是多少<代码>48.5626446306492公里?完全正确。最初的问题想要“在一个新的列中”距离,但是如果OP想要成对的距离,那就没有意义了