Эффективный способ сделать пространственных anaylsis с пандами
Я сталкиваюсь с проблемами, занимаясь пространственным анализом с фреймом данных панды. Сейчас у меня есть фрейм данных с > 1000 строками и столбцами "пользователь", "широта", "долгота".
На основе этого набора данных я хотел бы сделать некоторый пространственный анализ, например, создать четвертый столбец, который суммирует всех пользователей, находящихся в пределах 100-километрового диапазона.
Есть ли способ сделать это эффективно?Прямо сейчас я использую два for loops и geopy для вычисления расстояния в следующем Способ:
df_geo['Neighbors'] = 0
def getNeighbors():
for i in df_geo.index:
p1 = (df_geo.ix[i]['latitude'], df_geo.ix[i]['longitude'])
count = 0
for i2 in df_geo.index:
p2 = Point (df_geo.ix[i2]['latitude'], df_geo.ix[i2]['longitude'])
if geopy.distance.distance(p1, p2).km < 100 & i != i2:
count += 1
df_geo.Neighbors[i] = count
getNeighbors()
Спасибо
Энди
1 ответ:
Я думаю, что сделал бы столбец для точечных объектов:
df['point'] = df.apply(lambda row: Point(row['latitude'], row['longitude']))
Затем сделайте что-нибудь вроде:
def neighbours_of(p, s): '''count points in s within 100km radius of p''' return s.apply(lambda p1: geopy.distance.distance(p, p1).km < 100).count() df['neighbours'] = df['points'].apply(lambda p: neighbours_of(p, df['points']) - 1) # the -1 ensures we don't include p in the count
однако заявка в заявке все равно не будет особенно эффективной...