我可以申请我的 invincenty
并确定两台连续机器之间的距离。但是,我想在不重复的情况下找到组中所有机器之间的距离。geopy
dataframe
pandas
例如,如果我按公司名称分组,并且有 3 台机器与该公司关联,我想找到机器 1 和 2、1 和 3 以及(2 和 3)之间的距离,但不计算(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) 之间的距离以及机器的距离 in co_nm bb
and cc
,但我们不会确定不同co_nm
组中机器的距离。
这有意义吗?