Цикл по двум кадрам данных Pandas и применение функции подсчета аэропортов на заданном расстоянии от города
У меня есть два кадра данных панд, первый из которых содержит города и их соответствующие координаты, а другой содержит аэропорты и их координаты (примеры ниже). Я хотел бы подсчитать, сколько аэропортов находится на определенном расстоянии (геодезическом) от заданного города, и сохранить его в виде столбца в кадре данных города. Вот глава датафреймов (аэропортов, затем городов):
| Name | IATA | City | Latitude | Longitude |
|--------------------------------------------------|-------------|--------------|--------------|-------------|
| Hartsfield Jackson Atlanta International Airport | ATL | Atlanta | 33.636700 | -84.428101 |
| Los Angeles International Airport | LAX | Los Angeles | 33.942501 | -118.407997 |
| Chicago O'Hare International Airport | ORD | Chicago | 41.978600 | -87.904800 |
| city | city_lat | city_long | airports_80miles |
|----------------------------------------|------------------|-------------------|--------------------------|
| Akron, OH Metro Area | 41.146639 | -81.350110 | 0 |
| Albany, OR Metro Area | 44.488898 | -122.537208 | 0 |
| Albany-Schenectady-Troy, NY Metro Area | 42.787920 | -73.942348 | 0 |
Вот простая функция, которая будет использоваться:
def distance(origin, destination):
lat1, lon1 = origin
lat2, lon2 = destination
radius = 6371 # km
lat1 = math.radians(lat1)
lat2 = math.radians(lat2)
lon1 = math.radians(lon1)
lon2 = math.radians(lon2)
dlat = (lat2-lat1)
dlon = (lon2-lon1)
a = math.sin(dlat/2) * math.sin(dlat/2) + math.cos(lat1) \
* math.cos(lat2) * math.sin(dlon/2) * math.sin(dlon/2)
c = 2 * math.atan2(math.sqrt(a), math.sqrt(1-a))
d = radius * c
return d*0.62
Как я могу применить эту функцию расстояния к каждому городу, циклически изменяя данные аэропортов и их координаты?
Заранее спасибо!
1 ответ
Решение
Использование apply
функционировать дважды:
Допустим, датафрейм аэропорта df1
и городской датафрейм df2
и пороговое расстояние составляет 80.
threshold_distance = 80.0
df2["Airports_within_threshold"] = df2.apply(lambda x:
df1.apply(lambda y:
distance((x["city_lat"], x["city_long"]),
(y["Latitude"],y["Longitude"]))
< threshold_distance, axis = 1),
axis = 1).sum(axis = 1)