【发布时间】:2016-04-19 18:54:01
【问题描述】:
我可以将geopy 中的vincenty 应用于pandas 中的dataframe 并确定两台连续机器之间的距离。但是,我想在不重复的情况下找到组中所有机器之间的距离。
例如,如果我按公司名称分组并且有 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) 之间的距离以及 co_nm bb 和 @987654329 中机器的距离@ 也是如此,但我们不会确定不同 co_nm 组中机器的距离。
这有意义吗?
【问题讨论】:
-
你能发布想要的输出/结果 DF 吗?