我有一个大尺寸的单元格网格。每个单元格都有一个 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,6,504,505,506。 (这些是上表中行的 ID - p1
)。
我正在尝试的是:
对于 i
中选定的值/行 p1
,我想知道距 i
选定距离内的所有邻居,并对它们所有的 p3
值求和。
我尝试应用此解决方案( link ),但我不知道如何合并距离参数。可以使用 df.iloc
获取单元格值,但在此之前的步骤对我来说有点棘手。
你能给我一些建议吗?
编辑:
使用 Thomas 的解决方案并将 df 称为 CO
:
p3
0 45
1 580
2 12000
3 12531
4 22456
我想添加另一列并使用 p3
列中的值
CO['new'] = format(sum_neighbors(data, CO['p3']))
但是这不起作用。如果我添加一个数字而不是对行 CO['p3']
的引用,它就会像魅力一样工作。但是如何在 format
函数中自动使用 p3 列中的值?
已解决: 它适用于:
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)
,这似乎是暗示的(所以我们根本不需要它)。 - 鉴于OP定义的
i
的邻居列表,我不认为505
是5
的邻居。
关于python - 在python中计算给定距离的网格值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52873547/