从一个点到Pandas数据框中行的欧几里得距离

10

我有一个数据框

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]

我想在数据框中创建一个新列,其中包含距离。
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)

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

2个回答

21

使用向量化方法

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)

3
它们之间哪个更快? - Rob Rose
非常感谢这个,非常有用。提醒未来可能会经过的任何人,纬度和经度不是相同的距离单位,在计算距离之前应该转换为投影。 - skrhee

3

将 [(x2 - x1)2 + (y2 - y1)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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接