我有一个大尺寸的单元格。每个单元格都有一个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
,{{ 1}},i+500+1
)。
例如:5中的i+500-1
具有邻居-4,6,504,505,506。 (这些是上方表格中的行ID-p1
)。
我想要的是:
对于p1
中的选定值/行i
,我想知道与p1
选定距离内的所有邻居,并将其所有i
值相加。
我尝试应用此解决方案(link),但是我不知道如何合并distance参数。可以使用p3
来获取单元格的值,但是之前的步骤对我来说有点棘手。
你能给我什么建议吗?
编辑:
使用Thomas的解决方案并让df调用df.iloc
:
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
答案 0 :(得分:3)
解决方案:
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
的邻居。