Расчет значений сетки с учетом расстояния в питоне

1

У меня есть сетка ячеек больших размеров. Каждая ячейка имеет 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)
  • 0
    Этот вопрос довольно неясен. у p1 of 5 есть соседи 4,6504,505,506, но тогда вы действительно не дали нам никаких указаний на то, как p3 изменяется с p1, потому что значения соседей, которые вы отображали, были относительно p1. Итак, как мы узнаем, как p3 должен измениться по отношению к p1
Теги:
pandas
dataframe

1 ответ

2
Лучший ответ

Решение:

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 определенных ОП.
  • 0
    Сетка шириной 500 ячеек и имеет аналогичную высоту. Вот почему соседние ячейки из 5 - те, что я описал. В противном случае - отличное решение.
  • 0
    Но с другой стороны - где можно было бы включить условия: 1) суммировать значения, если значение p3> 2, и 2) расстояние не более 1000 между ячейками?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню