У меня есть DataFrame с именем location_details , который содержит названия местоположений, широты и долготы:
location_details :
Index Latitude Longitude
London 51.3245 -3.2341
Paris 52.4523 -3.5334
New York 50.2313 -3.3245
На основании этого фрейм данных, я хочу создать еще один фрейм данных со всеми местоположениями в индексе, всеми местоположениями в столбцах и расстоянием в км между любыми двумя местоположениями в виде полей. Это будет выглядеть примерно так:
new_dataframe:
Index London Paris New York
London 0 1000 2000
Paris 1000 0 3000
New York 2000 3000 0
Я использую эту формулу для расчета расстояний:
import geopy.distance
coords_1 = (52.2296756, 21.0122287)
coords_2 = (52.406374, 16.9251681)
print (geopy.distance.distance(coords_1, coords_2).km)
То, что я сделал, что не является pythoni c и не оптимизирован каким-либо образом, это:
- Я сначала создал список с именем location_name , который содержит все местоположения - например,
location_name = ['London','Paris','New York']
- Использование двойного для l oop Я получаю координаты всех местоположений и добавляю их к new_dataframe , используя формулу выше
for i in location_name:
coords_i = (location_details.loc[i]['Latitude'],location_details.loc[i]['Longitude'])
for j in location_name:
coords_j = (location_details.loc[j]['Latitude'],location_details.loc[j]['Longitude'])
new_dataframe.loc[i,j] = geopy.distance.distance(coords_i,coords_j).km
Есть ли более разумный способ сделать это? Я не знаю, как apply будет использоваться в этих обстоятельствах.
EDIT:
Нашел ниже аккуратное решение, которое много собрано, гораздо быстрее, чем мое первоначальное решение:
for i in all_locations:
location_coordinates.append([name,(latitude,longitude)])
location_name.append(name)
location_distances_list = [geopy.distance.distance(value_i[1],value_j[1]).km for i, value_i in enumerate(location_coordinates) for j, value_j in enumerate(location_coordinates)]
location_distances = pd.DataFrame(np.array(location_distances_list).reshape(2583,2583),
columns=location_name, location=station_name)