python - 如何使用熊猫经纬度数据快速计算距离?
问题描述
我有一张带有不同位置数据的熊猫表。例如,纽约市有很多学校、医院、商店等。每个都有自己的经度和纬度。
我有 40000 行数据和两列数据(经度和纬度)。我想计算它们之间的距离(总共 40000*40000)。
我使用了haversine 公式(Python 中的Haversine 公式(两个GPS 点之间的方位角和距离))来处理pandas。
简单代码如下:
results=df.apply(lambda x:haversine(x["lon"],x["lat"],test_lon,test_lat)
我使用每一行作为 test_lon,test_lat,并且需要 10 个小时来计算它们。我无法相信为什么需要这么长时间才能做到这一点。
任何人有好主意快速做到这一点?
解决方案
我有一个我一直在使用的解决方法,因为我在斯德哥尔摩的瑞典交通系统中遇到了同样的问题。它很丑,但效果很好。可能有用。我复制了我的原始数据:
import pandas as pd
import numpy as np
import sklearn.neighbors
locations_A = pd.DataFrame({
'Stopp_A' : ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H'],
'latitude_A': [ 56.75,56.19,56.08,51.28,52.36,51.29,51.87,52.61],
'longitude_A': [18.39,18.82, 18.65,18.74,18.06,18.61,18.27,18.20]
})
locations_B = pd.DataFrame({
'Stopp_B' : ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H'],
'latitude_B': [ 56.75,56.19,56.08,51.28,52.36,51.29,51.87,52.61],
'longitude_B': [18.39,18.82,18.65,18.74,18.06,18.61,18.27,18.20]
})
如您所见,我在副本中将位置名称从Stopp_A
更改为 。Stopp_B
在此之后,我计算弧度并创建一个距离矩阵:
locations_A[['lat_radians_A','long_radians_A']] = (
np.radians(locations_A.loc[:,['latitude_A','longitude_A']])
)
locations_B[['lat_radians_B','long_radians_B']] = (
np.radians(locations_B.loc[:,['latitude_B','longitude_B']])
)
dist = sklearn.neighbors.DistanceMetric.get_metric('haversine')
dist_matrix = (dist.pairwise
(locations_A[['lat_radians_A','long_radians_A']],
locations_B[['lat_radians_B','long_radians_B']])*6371 #Radius in kilometer
)
df_dist_matrix = (
pd.DataFrame(dist_matrix,index=locations_A['Stopp_A'],
columns=locations_B['Stopp_B'])
)
df_dist = (
pd.melt(df_dist_matrix.reset_index(),id_vars='Stopp_A')
)
df_dist = df_dist_long.rename(columns={'value':'Kilometers'})
返回:
Stopp_A Stopp_B Kilometers
0 A A 0.000000
1 B A 2088.626114
2 C A 2043.060585
3 D A 950.191543
4 E A 1506.375876
.. ... ... ...
59 D H 3051.681403
60 E H 3990.191284
61 F H 3737.181244
62 G H 1083.053543
63 H H 0.000000
这种方法大大减少了我的计算时间。
推荐阅读
- databricks - databricks:将 spark 数据框直接写入 excel
- meson-build - 介子相当于 automake 的 CONFIG_STATUS_DEPENDENCIES?
- c# - Master Data Services 使用 WCF 服务创建实体成员
- r - 如何在 r 中指定 nls 函数的数据范围?
- reactjs - React Native 医生建议升级 Android SDK 版本但我使用的是最新版本?
- c - 为什么在尝试编译 C 文件时出现链接器错误?
- sharepoint-online - 如何使用 sphttp(不是 sp.web 或 pnp)spfx 获取用户当前标题
- php - 将值存储在 PHP 中 Postgres SQL 查询的变量中
- mysql - SQL 条件连接查询
- python - 如何在不知道语言环境的情况下将字符串转换为浮点数?