我有DataFrame df,其中包含x轴,y轴和填充numpy矩阵mat的值的信息。

较小的df示例:

y   x   x   x   x   value   value   value   value
1   6   3   6   4   100     10      300     15
1   6   2   8   7   50      200     35      70
5   7   5   4   6   2       50      40      400
7   5   3   2   1   105     80      35      44


我想用每个mat = np.zeros(shape=(10,10))是行索引,y是列索引来填充x,其值与值块中x的位置相同。如

col=1, row=6, value=100 ###
col=1, row=3, value=10
col=1, row=6, value=300 ###
col=1, row=4, value=10
col=1, row=6, value=50  ###


如果有多个值进入该位置(例如###),请进行平均。有什么方法可以直接从熊猫转到矩阵(或其他快速方法)?

我现在能做的是首先使用数据帧中选定列的np.ravel来制作一维数组并从这些数组中填充,但它很慢且很多余。

最佳答案

构造行和列索引并执行切片分配。

val = df.values
j = val[:, 0].repeat(4)
i = val[:, 1: 5].ravel()
v = val[:, 5:].ravel()
mat = np.zeros(shape=(10,10), dtype=int)

mat[i, j] = v

mat

array([[  0,   0,   0,   0,   0,   0,   0,   0,   0,   0],
       [  0,   0,   0,   0,   0,   0,   0,  44,   0,   0],
       [  0, 200,   0,   0,   0,   0,   0,  35,   0,   0],
       [  0,  10,   0,   0,   0,   0,   0,  80,   0,   0],
       [  0,  15,   0,   0,   0,  40,   0,   0,   0,   0],
       [  0,   0,   0,   0,   0,  50,   0, 105,   0,   0],
       [  0,  50,   0,   0,   0, 400,   0,   0,   0,   0],
       [  0,  70,   0,   0,   0,   2,   0,   0,   0,   0],
       [  0,  35,   0,   0,   0,   0,   0,   0,   0,   0],
       [  0,   0,   0,   0,   0,   0,   0,   0,   0,   0]])




对于平均值

val = df.values
j = val[:, 0].repeat(4)
i = val[:, 1: 5].ravel()
v = val[:, 5:].ravel()

sums = np.bincount(i * 10 + j, v, 100)
cnts = np.bincount(i * 10 + j, minlength=100)
mask = cnts > 0

sums[mask] /= cnts[mask]

print(sums.reshape(10, 10))

[[   0.    0.    0.    0.    0.    0.    0.    0.    0.    0.]
 [   0.    0.    0.    0.    0.    0.    0.   44.    0.    0.]
 [   0.  200.    0.    0.    0.    0.    0.   35.    0.    0.]
 [   0.   10.    0.    0.    0.    0.    0.   80.    0.    0.]
 [   0.   15.    0.    0.    0.   40.    0.    0.    0.    0.]
 [   0.    0.    0.    0.    0.   50.    0.  105.    0.    0.]
 [   0.  150.    0.    0.    0.  400.    0.    0.    0.    0.]
 [   0.   70.    0.    0.    0.    2.    0.    0.    0.    0.]
 [   0.   35.    0.    0.    0.    0.    0.    0.    0.    0.]
 [   0.    0.    0.    0.    0.    0.    0.    0.    0.    0.]]

关于python - 从Pandas DataFrame快速填充大型Numpy矩阵,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47429616/

10-12 16:50
查看更多