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 个站点,只需将第 i 行的 np.tile(data[0], (data.shape[0], 1)) 更改为 np.tile(data[i], (data.shape[0], 1))。如果您要为多行执行此操作,那么每次创建数据副本并使用它以保持原始数据保持不变也是明智之举。
一旦您获得了最近站点的 ID,您就可以对它们做任何您想做的事情。把它们放在另一张桌子上,让它们看起来很漂亮,或者用它们做你想做的事。如果您需要将 ndarray 转回 Pandas 数据框,只需使用 pandas.DataFrame(ndarray)。