根据python

时间:2018-10-18 12:02:21

标签: python pandas dataframe

我有一个大尺寸的单元格。每个单元格都有一个ID(p1),单元格值(p3)和实际度量中的坐标(XY)。这就是前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+1i-500-1i-1i+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

1 个答案:

答案 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

注意:

  • 我认为p1range(N),这似乎暗示了这一点(因此我们根本不需要它)。
  • 考虑到OP定义的505邻居列表,我不认为5i的邻居。