Рассчитать расстояние между двумя точками для каждого элемента в DF несколько раз - PullRequest
0 голосов
/ 26 марта 2020

Допустим, у нас есть 2 кадра данных:

DF1

     name  latitude   longitude
0    A     40.730610  -73.935242
1    B     42.095554  -79.238609
2    C     31.442778  -100.450279

DF2

     name  latitude   longitude
0    AA     40.560001  -74.290001
1    BB     33.193611  -117.241112
2    CC     41.676388  -86.250275
3    DD     34.155834  -119.202789

С

from geopy.distance import geodesic, great_circle
newport_ri = (41.49008, -71.312796)
cleveland_oh = (41.499498, -81.695391)
print(geodesic(newport_ri, cleveland_oh).miles)

можно вычислить расстояние между двумя точками.
Как рассчитать расстояния для A, B, C в DF1 до каждого элемента в DF2 (AA, BB, CC, DD) и сохранить эту информацию в другом DF или словаре ?

Должно приблизительно выглядеть так:

   from   to   distance
   A      AA   5
   A      BB   2
   ...
   C      DD   16

1 Ответ

1 голос
/ 26 марта 2020

Я бы сначала построил декартово произведение обоих фреймов данных:

resul = df1.set_index(np.zeros(len(df1), 'int')).join(df2.set_index(np.zeros(len(df2), 'int')),
                                                lsuffix='_1', rsuffix='_2').reset_index(drop=True)

, чтобы получить:

   name_1  latitude_1  longitude_1 name_2  latitude_2  longitude_2
0       A   40.730610   -73.935242     AA   40.560001   -74.290001
1       A   40.730610   -73.935242     BB   33.193611  -117.241112
2       A   40.730610   -73.935242     CC   41.676388   -86.250275
3       A   40.730610   -73.935242     DD   34.155834  -119.202789
4       B   42.095554   -79.238609     AA   40.560001   -74.290001
5       B   42.095554   -79.238609     BB   33.193611  -117.241112
6       B   42.095554   -79.238609     CC   41.676388   -86.250275
7       B   42.095554   -79.238609     DD   34.155834  -119.202789
8       C   31.442778  -100.450279     AA   40.560001   -74.290001
9       C   31.442778  -100.450279     BB   33.193611  -117.241112
10      C   31.442778  -100.450279     CC   41.676388   -86.250275
11      C   31.442778  -100.450279     DD   34.155834  -119.202789

Теперь легко вычислить расстояния:

df[distance] = df.apply(lambda x: geodesic((x['latitude_1'], x['longitude_1']),
                                           (x['latitude_2'], x['longitude_2'])), axis=1)

Теперь вы можете удалять ненужные столбцы и / или переименовывать их ...

...