Если я правильно понимаю, вы хотите сравнить каждую координату в исходном кадре данных с каждой координатой цели и получить истинный кадр данных индикаторов, если соответствующее расстояние меньше 2 км.
Вот один подход.Ключевым компонентом является scipy.spatial.distance.cdist
, который может вычислять попарные расстояния.
import pandas as pd
import numpy as np
from scipy.spatial.distance import cdist
from haversine import haversine
df = pd.read_csv(
pd.compat.StringIO(
"""ID Time Latitude Longitude
1 2:00 60.092033 20.765083
1 3:00 60.097300 20.672767
1 4:00 60.125550 20.593650
1 5:00 60.115233 20.505367
1 6:00 60.103800 20.425850
1 7:00 60.113750 20.335717
1 8:00 60.115683 20.303683
1 9:00 60.114817 20.305500
1 10:00 60.077983 20.316917
1 11:00 60.034500 20.305317"""
),
sep=r" +",
)
targets = pd.DataFrame(
[[60.103900, 20.415850], [60.403900, 20.715850]], columns=["Latitude", "Longitude"]
)
res_data = (
cdist(
df[["Latitude", "Longitude"]],
targets[["Latitude", "Longitude"]],
metric=haversine,
)
< 2
)
res_df = pd.DataFrame(
res_data,
index=df[["Latitude", "Longitude"]].round(3).apply(tuple, axis=1),
columns=targets[["Latitude", "Longitude"]].round(3).apply(tuple, axis=1),
)
Результат:
(60.104, 20.416) (60.404, 20.716)
(60.092, 20.765) False False
(60.097, 20.673) False False
(60.126, 20.594) False False
(60.115, 20.505) False False
(60.104, 20.426) True False
(60.114, 20.336) False False
(60.116, 20.304) False False
(60.115, 20.306) False False
(60.078, 20.317) False False
(60.034, 20.305) False False