首页 > 解决方案 > python数据框中站点之间的距离计算

问题描述

我正在使用 Python 中的经纬度坐标,并且试图在数据框中找到两个站点之间的距离,但是,我正在努力找出如何在 pandas 中执行此操作。如果 long = x 和 lat = y,我理解计算距离 sqrt((x1-x2)^2 + (y1-y2)^2) 的逻辑,但我不明白我将如何在数据中解决这个问题框架。我的任务更加复杂,因为我试图在第 1 行中找到最接近站点的前 3 个站点(最终我必须遍历所有行)。

问题是,有没有比逐行迭代更好的方法来解决这个问题?由于我还必须找到每行最近的 k 个站点,我不确定 iterrow() 是否是最好的解决方案,但我想不出更聪明的矩阵方法来解决这个问题。请参阅下面的示例数据。所以我需要一列“最近的站点”,对于第 1 行,最近的站点将是:6,然后是 4,然后是 5,所以我需要第 1 行显示如下:

在此处输入图像描述

谢谢。

样本数据:

在此处输入图像描述

标签: pythonpandaslogic

解决方案


即使使用庞大的数据集,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).


推荐阅读