Итерация по двум фреймам данных для применения функции - PullRequest
0 голосов
/ 12 декабря 2018

У меня есть следующие два кадра данных (сокращенно):

df1
day Transmitter_ID  Species Lat Lng Date
4   A69-1601-27466  Golden perch    -35.495479100000004 144.45295380000002  13/08/2015
5   A69-1601-27466  Golden perch    -35.495479100000004 144.45295380000002  14/08/2015
6   A69-1601-27466  Golden perch    -35.495479100000004 144.45295380000002  15/08/2015
7   A69-1601-27466  Golden perch    -35.495479100000004 144.45295380000002  16/08/2015
8   A69-1601-27466  Golden perch    -35.5065473 144.4488804 17/08/2015
8   A69-1601-27466  Golden perch    -35.495479100000004 144.45295380000002  17/08/2015
9   A69-1601-27466  Golden perch    -35.5065473 144.4488804 18/08/2015
10  A69-1601-27466  Golden perch    -35.5065473 144.4488804 19/08/2015
11  A69-1601-27466  Golden perch    -35.5065473 144.4488804 20/08/2015
12  A69-1601-27466  Golden perch    -35.5065473 144.4488804 21/08/2015
13  A69-1601-27466  Golden perch    -35.5065473 144.4488804 22/08/2015
14  A69-1601-27466  Golden perch    -35.5065473 144.4488804 23/08/2015
15  A69-1601-27466  Golden perch    -35.5065473 144.4488804 24/08/2015

rivergps_df
Lng Lat River
151.7753278 -32.90526725    HUNTER RIVER
151.77526830000002  -32.90610052    HUNTER RIVER
151.77526830000002  -32.90752299    HUNTER RIVER
151.77526830000002  -32.90758849    HUNTER RIVER
151.775397  -32.90977754    HUNTER RIVER
151.7754468 -32.91062396    HUNTER RIVER
151.775578  -32.91202941    HUNTER RIVER
151.77578799999998  -32.9142797 HUNTER RIVER
151.7758178 -32.91459931    HUNTER RIVER
151.77586340000002  -32.91508789    HUNTER RIVER
151.7764116 -32.91645856    HUNTER RIVER
151.7765776 -32.91687345    HUNTER RIVER
151.77719040000002  -32.91861786    HUNTER RIVER

У меня также есть функция haversine, которая принимает пару lat, lng и возвращает расстояние между двумя парами

def haversine(lon1, lat1, lon2, lat2):
    """
    Calculate the great circle distance between two points 
    on the earth (specified in decimal degrees)
    """
    # convert decimal degrees to radians 
    lon1, lat1, lon2, lat2 = map(radians, [lon1, lat1, lon2, lat2])

    # haversine formula 
    dlon = lon2 - lon1 
    dlat = lat2 - lat1 
    a = sin(dlat/2)**2 + cos(lat1) * cos(lat2) * sin(dlon/2)**2
    c = 2 * asin(sqrt(a)) 
    r = 6371 # Radius of earth in kilometers. Use 3956 for miles

То, что я хочу сделать с двумя фреймами данных:

Взять каждый lng / lat из df1 и для каждой точки применить функцию haversine для всего диапазона lng / lat из rivergps_df

Вернуть индекс rivergps_df, где был найден минимум для функции haversine

Добавить этот индекс rivergps_df к df1

Так что я имею в виду для первой точки в df1 -35.495479100000004, 144.45295380000002, Iхотите применить к нему функцию haversine как lon1, lat1 против lon2, lat2, где lon2, lat2 - все точки, которые существуют в rivergps_df.Затем я хочу найти минимум, возвращаемый функцией haversine, добавить его в df1 и перейти к следующей точке в df1.

Как бы я это сделал?

1 Ответ

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

Одна идея:

  • Определить функцию haversin_argmin(lat, lon, df), которая перебирает df (например, for (lat2, lon2) df[['Lat', 'Lon']].iterrows():) и вычисляет и возвращает argmin для haversine(lat, lon, lat2, lon2).

  • Затем определите другую функцию f, которая принимает row, получает lat и lon, вызывает haversin_argmin с rivergps_df и возвращает row сargmin добавляется в качестве нового поля.

  • Использование pandas.DataFrame.apply до apply f до df1.

Прочитайте документацию по apply, чтобы лучше понять, как определить f и какие опции передать apply.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...