【问题标题】:distance calculations between sites in a python data framepython数据框中站点之间的距离计算
【发布时间】:2020-08-21 16:37:49
【问题描述】:

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

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

谢谢。

样本数据:

【问题讨论】:

    标签: python pandas logic


    【解决方案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 个站点,只需将第 i 行的 np.tile(data[0], (data.shape[0], 1)) 更改为 np.tile(data[i], (data.shape[0], 1))。如果您要为多行执行此操作,那么每次创建数据副本并使用它以保持原始数据保持不变也是明智之举。

    一旦您获得了最近站点的 ID,您就可以对它们做任何您想做的事情。把它们放在另一张桌子上,让它们看起来很漂亮,或者用它们做你想做的事。如果您需要将 ndarray 转回 Pandas 数据框,只需使用 pandas.DataFrame(ndarray)

    【讨论】:

    • 谢谢!比我计划做的要高效得多!现在试着去理解它!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-21
    • 2014-11-29
    • 2015-10-24
    • 2014-02-28
    • 2010-10-30
    相关资源
    最近更新 更多