Вычисление расстояния между значениями столбца в кадре данных панд - PullRequest
0 голосов
/ 19 ноября 2018

Я приложил образец моего набора данных. У меня минимальный опыт в Panda, поэтому я изо всех сил пытаюсь сформулировать проблему.

enter image description here

То, что я пытаюсь сделать, это заполнить столбец 'dist' (декартово: p1 = (lat1,long1) ; p2 = (lat2,long2)) для каждого индекса в зависимости от штата и округа.

В каждом округе может быть несколько p1. Мы используем ближайший к p2 при расчете расстояния. Когда у округа нет значения p1, мы просто используем следующее, которое входит в последовательность.

Как мне решить эту проблему кратко? Я могу представить себе запуск итератора над округом / штатом, но не в состоянии выйти за пределы этого.

[РЕДАКТИРОВАТЬ] Вот заголовок фрейма данных, как предлагается ниже. (Игнорировать несоответствие с картинки)

   lat1 long1 state           county   lat2  long2
0     .     .    AK   Aleutians West   11.0   23.0
1     .     .    AK     Wade Hampton   33.0   11.0
2     .     .    AK      North Slope   55.0   11.0
3     .     .    AK  Kenai Peninsula   44.0   11.0
4     .     .    AK        Anchorage   11.0   11.0
5     1     2    AK        Anchorage    NaN    NaN
6     .     .    AK        Anchorage   55.0   44.0
7     3     4    AK        Anchorage    NaN    NaN
8     .     .    AK        Anchorage    3.0    2.0
9     .     .    AK        Anchorage    5.0   11.0
10    .     .    AK        Anchorage   42.0   22.0
11    .     .    AK        Anchorage   11.0    2.0
12    .     .    AK        Anchorage  444.0    1.0
13    .     .    AK        Anchorage    1.0    2.0
14    0     2    AK        Anchorage    NaN    NaN
15    .     .    AK        Anchorage    1.0    1.0
16    .     .    AK        Anchorage  111.0   11.0

1 Ответ

0 голосов
/ 19 ноября 2018

Вот как я это сделаю, используя Shapely, движок, лежащий в основе Geopandas, и я собираюсь использовать рандомизированные данные.

from shapely.geometry import LineString
import pandas as pd
import random


def gen_random():
  return [random.randint(1, 100) for x in range(20)]

j = {"x1": gen_random(), "y1": gen_random(),
     "x2": gen_random(), "y2": gen_random(),}
df = pd.DataFrame(j)


def get_distance(k):
  lstr = LineString([(k.x1, k.y1,), (k.x2, k.y2) ])
  return lstr.length

df["Dist"] = df.apply(get_distance, axis=1)

Форма: http://toblerity.org/shapely/manual.html#introduction Геопанды: http://geopandas.org/

...