データフレームがあります
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()を使用して2点間のユークリッド距離を見つけることを知っています:
dist = math.hypot(x2 - x1, y2 - y1)
行を適用または反復して距離を取得する関数を作成するにはどうすればよいですか?.
ベクトル化されたアプローチを使用する
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)
[(x2 - バツ1)2 +(y2 -y1)2]1/2 into pandas vectorized operations、you have:
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