python - python数据框中站点之间的距离计算
问题描述
我正在使用 Python 中的经纬度坐标,并且试图在数据框中找到两个站点之间的距离,但是,我正在努力找出如何在 pandas 中执行此操作。如果 long = x 和 lat = y,我理解计算距离 sqrt((x1-x2)^2 + (y1-y2)^2) 的逻辑,但我不明白我将如何在数据中解决这个问题框架。我的任务更加复杂,因为我试图在第 1 行中找到最接近站点的前 3 个站点(最终我必须遍历所有行)。
问题是,有没有比逐行迭代更好的方法来解决这个问题?由于我还必须找到每行最近的 k 个站点,我不确定 iterrow() 是否是最好的解决方案,但我想不出更聪明的矩阵方法来解决这个问题。请参阅下面的示例数据。所以我需要一列“最近的站点”,对于第 1 行,最近的站点将是:6,然后是 4,然后是 5,所以我需要第 1 行显示如下:
谢谢。
样本数据:
解决方案
即使使用庞大的数据集,Numpy 也使这变得简单易行。见下文。
# Turn Pandas dataframe into ndarray
data = data.to_numpy(dtype='float')
# Make a reference array out of first row
ref = np.tile(data[0], (data.shape[0], 1))
# Use vectorized computation to find distance for each site
dist = (data[:,1:3] - ref[:,1:3]) ** 2 # Replace 1:3 with appropriate column indices for lat and long
dist = np.sum(dist, axis=1)
dist = np.sqrt(dist).resize((data.shape[0], 1))
# Concatenate distance on to data
data = np.concatenate((data, dist), axis=1)
# Sort resulting ndarray by distance
data = data[np.argsort(data[:,-1])]
# Get IDs of 3 closest sitaes
ids = [data[i, 0] for i in range(1, 4)]
此代码可以快速将三个最近站点的 ID 值返回到数据的第一行。如果您也想找到离其他行最近的 3 个站点,只需更改np.tile(data[0], (data.shape[0], 1))
为np.tile(data[i], (data.shape[0], 1))
第 i 行。如果您要为多行执行此操作,那么每次创建数据的副本并使用它也是明智的,这样您的原始数据保持不变。
获得最近站点的 ID 后,您可以对它们做任何您想做的事情。把它们放在另一张桌子上,让它们看起来很漂亮,或者用它们做你想做的事。如果您需要将 ndarray 转回 Pandas 数据框,只需使用pandas.DataFrame(ndarray)
.
推荐阅读
- python - cx-Freeze 可执行文件无法在另一台计算机上运行
- sql - 我想按在 SELECT 子句中创建的列过滤结果
- oracle-apex-5 - 需要在交互式报告列上使用 Apex Office 打印调用打印功能
- mysql - 需要帮助将多个 mysql 表中的数据收集到一个 php 表中
- vb.net - 从表中获取所有字段名
- javascript - 窗口未聚焦时电子捕获鼠标事件
- angular - setValue 与 FormGroups 数组一起使用
- java - 如何使用 conda 安装的 Java 修复“无法找到请求目标的有效证书路径”错误?
- javascript - 您如何使用 JavaScript 从内部表的 TD 中影响 DIV?
- java - RedisTemplate 导致 Fortify 动态代码评估中的不安全反序列化