从Pandas DataFrame快速填充大型Numpy矩阵

时间:2017-11-22 08:07:13

标签: python python-2.7 pandas numpy

我有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选定列来制作1D阵列并从这些阵列中填充,但它很慢且冗余很多。

1 个答案:

答案 0 :(得分:1)

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

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.]]