python 数据框中站点之间的距离计算

distance calculations between sites in a python data frame

我正在使用 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)]

此代码可以快速 return 为您提供离数据第一行最近的三个站点的 ID 值。如果您也想找到离其他行最近的 3 个站点,只需将第 i 行的 np.tile(data[0], (data.shape[0], 1)) 更改为 np.tile(data[i], (data.shape[0], 1))。如果您打算对多行执行此操作,那么每次都创建一个数据副本并使用它也是明智的,这样您的原始数据就保持不变。

获得最近站点的 ID 后,您就可以随心所欲地使用它们。将它们放在另一个 table 中,使它们看起来很漂亮,或者用它们做你想做的事。如果您需要将 ndarray 转换回 Pandas 数据框,只需使用 pandas.DataFrame(ndarray).