Pandas Dataframe с двумя столбцами и двумя строками

У меня есть фрейм данных с двумя столбцами, которые содержат координаты долготы и широты:

импортировать панд как pd

values = {'Latitude': {0: 47.021503365600005,
  1: 47.021503365600005,
  2: 47.021503365600005,
  3: 47.021503365600005,
  4: 47.021503365600005,
  5: 47.021503365600005},
 'Longitude': {0: 15.481974060399999,
  1: 15.481974060399999,
  2: 15.481974060399999,
  3: 15.481974060399999,
  4: 15.481974060399999,
  5: 15.481974060399999}}

df = pd.DataFrame(values)
df.head()

Теперь я хочу применить функцию скользящего окна к фрейму данных, который принимает долготу и широту (два столбца) одной строки и другой строки (размер окна 2), чтобы вычислить расстояние гаверсинуса.

def haversine_distance(x):
    print (x)

df.rolling(2, axis=1).apply(haversine_distance)

Моя проблема в том, что я никогда не получаю все четыре значения Lng1, Lat1 (первая строка) и Lng2, Lat2 (вторая строка). Если я использую axis = 1, я получу Lng1 и Lat1 первой строки. Если я использую axis = 0, я получу Lng1 и Lng2 первой и второй строки, но только долготу.

Как я могу применить скользящее окно, используя две строки и два столбца? Примерно так:

def haversine_distance(x):
    row1 = x[0]
    row2 = x[1]
    lng1, lat1 = row1['Longitude'], row1['Latitude']
    lng2, lat2 = row2['Longitude'], row2['Latitude']
    # do your stuff here
    return 1

В настоящее время я выполняю этот расчет, соединяя фрейм данных с самим собой с помощью shift (-1), в результате чего все четыре координаты отображаются в одной строке. Но это должно быть возможно и с прокаткой. Другой вариант - объединить Lng и Lat в один столбец и применить к нему прокатку с осью = 0. Но ведь должен быть более простой способ?


person Matthias    schedule 20.11.2017    source источник
comment
Я не уверен, что есть более простой способ - я бы предложил присоединиться к shift(-1) и применить вашу функцию к каждой строке - наиболее эффективный способ сделать это. Я не знаю способа применить функцию к скользящему окну сразу для нескольких столбцов.   -  person Ken Syme    schedule 20.11.2017
comment
Возможный дубликат Python pandas Rolling_apply для ввода двух столбцов в функцию   -  person Jt Miclat    schedule 20.11.2017


Ответы (1)


Начиная с pandas v0.23, теперь можно передавать Series вместо ndarray в Rolling.apply (). Просто установите raw=False.

raw: bool, по умолчанию None

False: передает каждую строку или столбец как серию в функцию.

True или None: переданная функция вместо этого получит объекты ndarray. Если вы просто применяете функцию сокращения NumPy, это позволит достичь гораздо большей производительности. Необработанный параметр является обязательным, и если он не передан, будет отображаться FutureWarning. В будущем raw по умолчанию будет False.

Новое в версии 0.23.0.

Итак, основываясь на вашем данном примере, вы можете переместить широту в индекс и передать всю долготу, включая индекс, вашей функции:

df = df.set_index('Latitude')
df['Distance'] = df['Longitude'].rolling(2).apply(haversine_distance, raw=False)
person jorijnsmit    schedule 26.08.2018
comment
и 3 столбца? - person Ludo Schmidt; 27.05.2021