Другое решение, использующее библиотеку geopy для расчета расстояния:
from geopy.distance import lonlat, distance, great_circle
df = pd.DataFrame({'id': ['a', 'b', 'c', 'd'], 'lat': [-20, -21, -22, -24], 'lon': [-100, -101, -102, -103]})
#using merge to generate all possibilities between origin and destination
df= pd.merge(df.assign(key=0), df.assign(key=0),suffixes=('', '_x') , on='key').drop('key', axis=1)
#using the library geopy to gives the distance between 2 points
df['Miles'] = df.apply(
(lambda row:distance(lonlat(row['lon'], row['lat']),
lonlat(row['lon_x'], row['lat_x'])).miles), axis=1)
#create the crosstab
df = df.groupby(['id', 'id_x'])['Miles'].max().unstack()
print(df)
вывод с расстоянием, рассчитанным по метрике geodesic
(по умолчанию):
расстояние () = геодезическая ()
id_x a b c d
id
a 0.000000 94.516982 188.743084 335.820435
b 94.516982 0.000000 94.228293 242.812242
c 188.743084 94.228293 0.000000 151.653020
d 335.820435 242.812242 151.653020 0.000000
вывод с расстоянием, рассчитанным по метрике great_circle
: похоже, ваш способ сделать
df['Miles'] = df.apply(
(lambda row:great_circle(lonlat(row['lon'], row['lat']),
lonlat(row['lon_x'], row['lat_x'])).miles), axis=1)
id_x a b c d
id
a 0.000000 94.668589 189.040078 336.592761
b 94.668589 0.000000 94.373665 243.430364
c 189.040078 94.373665 0.000000 152.118443
d 336.592761 243.430364 152.118443 0.000000
Вы можете изменить метрические мили в КМ, просто измените расширение в distance () или great_circle () с .miles
на .km