在不使用循环的情况下访问数据帧中周围单元格的值

时间:2018-11-06 16:34:08

标签: python pandas

我正在寻找一种无需使用循环即可为数据帧中的每个单元格计算所有周围单元格(包括对角线)的值之和的方法。

我想出了类似的东西,但是它不包含对角线,一旦我包含对角线,某些单元格就会被计数太多。

# Initializing matrix a
columns = [x for x in range(10)]
rows = [x for x in range(10)]
matrix = pd.DataFrame(index=rows, columns=columns).fillna(0)

# filling up with mock values
matrix.iloc[5,4] = 1
matrix.iloc[5,5] = 1
matrix.iloc[5,6] = 1
matrix.iloc[4,5] = 1

matrix1 = matrix.apply(lambda x: x.shift(1)).fillna(0)
matrix2 = matrix.T.apply(lambda x: x.shift(1)).T.fillna(0)
matrix3 = matrix.apply(lambda x: x.shift(-1)).fillna(0)
matrix4 = matrix.T.apply(lambda x: x.shift(-1)).T.fillna(0)

matrix_out = matrix1 + matrix2 + matrix3 + matrix4

更准确地说,我计划仅使用0或1值填充数据框。上面的测试如下:

   0  1  2  3  4  5  6  7  8  9
0  0  0  0  0  0  0  0  0  0  0
1  0  0  0  0  0  0  0  0  0  0
2  0  0  0  0  0  0  0  0  0  0
3  0  0  0  0  0  0  0  0  0  0
4  0  0  0  0  0  1  0  0  0  0
5  0  0  0  0  1  1  1  1  0  0
6  0  0  0  0  0  0  0  0  0  0
7  0  0  0  0  0  0  0  0  0  0
8  0  0  0  0  0  0  0  0  0  0
9  0  0  0  0  0  0  0  0  0  0

此输入的预期输出为:

   0  1  2  3  4  5  6  7  8  9
0  0  0  0  0  0  0  0  0  0  0
1  0  0  0  0  0  0  0  0  0  0
2  0  0  0  0  0  0  0  0  0  0
3  0  0  0  0  1  1  1  0  0  0
4  0  0  0  1  3  3  4  2  1  0
5  0  0  0  1  2  3  3  1  1  0
6  0  0  0  1  3  3  3  2  1  0
7  0  0  0  0  0  0  0  0  0  0
8  0  0  0  0  0  0  0  0  0  0
9  0  0  0  0  0  0  0  0  0  0

我是否正确使用了apply中使用的shift()函数,还是建议不要这样做?

非常感谢!

1 个答案:

答案 0 :(得分:0)

看起来像您需要的

def sum_diag(matrix):
    return matrix.shift(1,axis=1).shift(1, axis=0) + matrix.shift(-1, axis=1).shift(1, axis=0) + matrix.shift(1, axis=1).shift(-1) + matrix.shift(-1, axis=1).shift(-1, axis=0)

def sum_nxt(matrix):
    return matrix.shift(-1) + matrix.shift(1) + matrix.shift(1,axis=1) + matrix.shift(-1, axis=1)

final = sum_nxt(matrix) + sum_diag(matrix)

输出

print(final.fillna(0).astype(int))


    0   1   2   3   4   5   6   7   8   9
0   0   0   0   0   0   0   0   0   0   0
1   0   0   0   0   0   0   0   0   0   0
2   0   0   0   0   0   0   0   0   0   0
3   0   0   0   0   1   1   1   0   0   0
4   0   0   0   1   3   3   4   2   1   0
5   0   0   0   1   2   3   3   1   1   0
6   0   0   0   1   2   3   3   2   1   0
7   0   0   0   0   0   0   0   0   0   0
8   0   0   0   0   0   0   0   0   0   0
9   0   0   0   0   0   0   0   0   0   0

请注意,如果边界中的数字不为零,您可能希望向所有.fillna(0)操作中添加shift,以确保边界也能正常工作。