Цикл по двум кадрам данных Pandas и применение функции подсчета аэропортов на заданном расстоянии от города - PullRequest
0 голосов
/ 28 декабря 2018

У меня есть два кадра данных панд, первый из которых содержит города и их соответствующие координаты, а другой содержит аэропорты и их координаты (примеры ниже).Я хотел бы подсчитать, сколько аэропортов находится на определенном расстоянии (геодезическом) от заданного города, и сохранить его в виде столбца в кадре данных города.Вот заголовок данных (аэропорты, затем города):

|                     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 Ответ

0 голосов
/ 28 декабря 2018

Используйте функцию 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...