У меня есть сетка ячеек больших размеров. Каждая ячейка имеет ID (p1
), значение ячейки (p3
) и координаты в действительных измерениях (X
, Y
). Так выглядят первые 10 строк/ячеек
p1 p2 p3 X Y
0 0 0.0 0.0 0 0
1 1 0.0 0.0 100 0
2 2 0.0 12.0 200 0
3 3 0.0 0.0 300 0
4 4 0.0 70.0 400 0
5 5 0.0 40.0 500 0
6 6 0.0 20.0 600 0
7 7 0.0 0.0 700 0
8 8 0.0 0.0 800 0
9 9 0.0 0.0 900 0
Соседние клетки клетки i
в p1
могут быть определены как (i-500+1
, i-500-1
, i-1
, i+1
, i+500+1
, i+500-1
). Например: p1
из 5 имеет соседей - 4,6504,505,506. (это ID строк в верхней таблице - p1
).
Я пытаюсь: для выбранного значения/строки i
в p1
я хотел бы знать всех соседей на выбранном расстоянии от i
и суммировать все их значения p3
.
Я попытался применить это решение (ссылку), но я не знаю, как включить параметр расстояния. Значение ячейки можно взять с помощью df.iloc
, но шаги перед этим немного сложны для меня.
Можете ли вы дать мне совет?
EDIT: Используя решение Томаса и имея df, называемый CO
:
p3
0 45
1 580
2 12000
3 12531
4 22456
Я хотел бы добавить еще один столбец и использовать значения из столбцов p3
CO['new'] = format(sum_neighbors(data, CO['p3']))
Но это не сработает. Если я добавлю число вместо ссылки на строку CO['p3']
это будет работать как шарм. Но как я могу использовать значения из столбца p3 автоматически в функции format
?
SOLVED: он работал с:
CO['new'] = CO.apply(lambda row: sum_neighbors(data, row.p3), axis=1)
Решение:
import numpy as np
import pandas
# Generating toy data
N = 10
data = pandas.DataFrame({'p3': np.random.randn(N)})
print(data)
# Finding neighbours
get_candidates = lambda i: [i-500+1, i-500-1, i-1, i+1, i+500+1, i+500-1]
filter = lambda neighbors, N: [n for n in neighbors if 0<=n<N]
get_neighbors = lambda i, N: filter(get_candidates(i), N)
print("Neighbors of 5: {}".format(get_neighbors(5, len(data))))
# Summing p3 on neighbors
def sum_neighbors(data, i, col='p3'):
return data.iloc[get_neighbors(i, len(data))][col].sum()
print("p3 sum on neighbors of 5: {}".format(sum_neighbors(data, 5)))
Выход:
p3
0 -1.106541
1 -0.760620
2 1.282252
3 0.204436
4 -1.147042
5 1.363007
6 -0.030772
7 -0.461756
8 -1.110459
9 -0.491368
Neighbors of 5: [4, 6]
p3 sum on neighbors of 5: -1.1778133703169344
Заметки:
p1
был range(N)
как будто подразумевалось (так что нам это совсем не нужно).505
является соседом по 5
учитывая список соседей i
определенных ОП.