私は私の中に適用vincenty
し、2 つの連続したマシン間の距離を決定することができます. ただし、グループ内のすべてのマシン間の距離を繰り返さずに見つけたいと考えています。geopy
dataframe
pandas
たとえば、会社名でグループ化し、この会社に関連付けられている 3 台のマシンがある場合、マシン 1 と 2、1 と 3、および (2 と 3) の間の距離を求めたいが、(2 と 2 の間の距離は計算しない)および 1) および (3 および 1) は、対称であるためです (同一の結果)。
import pandas as pd
from geopy.distance import vincenty
df = pd.DataFrame({'ser_no': [1, 2, 3, 4, 5, 6, 7, 8, 9, 0],
'co_nm': ['aa', 'aa', 'aa', 'bb', 'bb', 'bb', 'bb', 'cc', 'cc', 'cc'],
'lat': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
'lon': [21, 22, 23, 24, 25, 26, 27, 28, 29, 30]})
coord_col = ['lat', 'lon']
matching_cust = df['co_nm'] == df['co_nm'].shift(1)
shift_coords = df.shift(1).loc[matching_cust, coord_col]
# join in shifted coords and compute distance
df_shift = df.join(shift_coords, how = 'inner', rsuffix = '_2')
# return distance in miles
df['dist'] = df_shift.apply(lambda x: vincenty((x[1], x[2]),
(x[4], x[5])).mi, axis = 1)
これは、グループ内の連続したマシンの距離のみを見つけます。これを拡張して、グループ内のすべてのマシンの距離を見つけるにはどうすればよいですか?
このコードは次を返します。
co_nm lat lon ser_no dist
0 aa 1 21 1 NaN
1 aa 2 22 2 97.47832
2 aa 3 23 3 97.44923
3 bb 4 24 4 NaN
4 bb 5 25 5 97.34752
5 bb 6 26 6 97.27497
6 bb 7 27 7 97.18804
7 cc 8 28 8 NaN
8 cc 9 29 9 96.97129
9 cc 10 30 0 96.84163
編集:
望ましい出力は、会社ごとに関連するマシンの一意の距離の組み合わせを見つけることです。つまり、co_nm aa
ser_no (1,2)、(1,3)、(2,3)、(1,3) の間の距離と、co_nm bb
and内のマシンの距離cc
も得られますが、そうではありません。異なるco_nm
グループ内のマシンの距離を決定します。
これは理にかなっていますか?