Применить для заполнения фрейма данных на основе полей в другом фрейме данных - PullRequest
2 голосов
/ 03 марта 2020

У меня есть 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 и не оптимизирован каким-либо образом, это:

  1. Я сначала создал список с именем location_name , который содержит все местоположения - например, location_name = ['London','Paris','New York']
  2. Использование двойного для 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)
...