【问题标题】:Find euclidean distance from a point to rows in pandas dataframe在熊猫数据框中查找从点到行的欧几里得距离
【发布时间】:2018-04-05 02:59:47
【问题描述】:

我有一个数据框

id    lat      long
1     12.654   15.50
2     14.364   25.51
3     17.636   32.53
5     12.334   25.84
9     32.224   15.74

我想从列表 L1 中保存的特定位置找到这些坐标的欧几里得距离

L1 = [11.344,7.234]

我想在我有距离的 df 中创建一个新列

id     lat     long    distance
1     12.654   15.50
2     14.364   25.51
3     17.636   32.53
5     12.334   25.84
9     32.224   15.74

我知道使用 math.hypot() 找到两点之间的欧几里得距离:

dist = math.hypot(x2 - x1, y2 - y1)

我如何编写一个函数,使用应用或迭代行来给我距离。

【问题讨论】:

    标签: python pandas dataframe euclidean-distance


    【解决方案1】:

    使用矢量化方法

    In [5463]: (df[['lat', 'long']] - np.array(L1)).pow(2).sum(1).pow(0.5)
    Out[5463]:
    0     8.369161
    1    18.523838
    2    26.066777
    3    18.632320
    4    22.546096
    dtype: float64
    

    也可以

    In [5468]: df['distance'] = df[['lat', 'long']].sub(np.array(L1)).pow(2).sum(1).pow(0.5)
    
    In [5469]: df
    Out[5469]:
       id     lat   long   distance
    0   1  12.654  15.50   8.369161
    1   2  14.364  25.51  18.523838
    2   3  17.636  32.53  26.066777
    3   5  12.334  25.84  18.632320
    4   9  32.224  15.74  22.546096
    

    选项 2 使用 Numpy 的内置 np.linalg.norm 向量范数。

    In [5473]: np.linalg.norm(df[['lat', 'long']].sub(np.array(L1)), axis=1)
    Out[5473]: array([  8.36916101,  18.52383805,  26.06677732,  18.63231966,   22.5460958 ])
    
    In [5485]: df['distance'] = np.linalg.norm(df[['lat', 'long']].sub(np.array(L1)), axis=1)
    

    【讨论】:

    • 一个比另一个快吗?
    • 非常感谢,非常有用。提醒将来可能遇到的任何人,纬度和经度不是同一个距离单位,在计算距离之前应将其转换为投影。
    【解决方案2】:

    翻译 [(x2 - x1)2 + (y2 - y 1)2]1/2 到 pandas 矢量化操作中,你有:

    df['distance'] = (df.lat.sub(11.344).pow(2).add(df.long.sub(7.234).pow(2))).pow(.5)         
    df
    
           lat   long   distance
    id                          
    1   12.654  15.50   8.369161
    2   14.364  25.51  18.523838
    3   17.636  32.53  26.066777
    5   12.334  25.84  18.632320
    9   32.224  15.74  22.546096
    

    或者,使用算术运算符:

    (((df.lat - 11.344) ** 2) + (df.long - 7.234) ** 2) ** .5
    

    【讨论】:

      猜你喜欢
      • 2020-09-15
      • 2019-09-30
      • 2021-01-13
      • 2020-11-14
      • 2021-06-22
      • 2021-01-16
      • 2019-01-02
      • 2020-03-05
      相关资源
      最近更新 更多