如何将熊猫3列数据框中的列转换为Python中的矩阵格式?

问题描述 投票:0回答:1

我在数据框中有3列,即X,Y,Z。我想将Z转换为基于X,Y的矩阵(所有列均具有数值)。 X和Y具有重复的条目,因此数据透视表不起作用。我的代码(n = #rows):

mat = numpy.zeros((n, n))
for i in range (0, n):
   for j in range (0, n):
        if (Y[j] == Y[i]):
            mat[i, j] = Z[j]
        if (X[j] == X[i]):
            mat[i, j] = Z[i]

产量

[[6 10  0 0]
 [6 10 10 0]
 [0 10 10 0]
 [0  0  0 6]]

数据看起来像:

X = array([100, 10, 10, 50]); 
Y = array([20, 20, 40, 60]); 
Z = array([6, 10, 10, 6]); 

所以正确的矩阵应该是:

[[6 10 10 0]
 [6 10 10 0]
 [0 10 10 0]
 [0  0  0 6]]

通过以下方式获得:

   | 100  10  10  50
--------------------
20 | 6   10  10   0
--------------------
20 | 6   10  10   0
--------------------
40 | 0   10  10   0
--------------------
60 | 0    0   0   6
--------------------
python dataframe matrix
1个回答
0
投票

我目前看不到如何比使用两个for循环更快地执行此操作。这应该工作:

data = pd.DataFrame({
    'X': np.array([100, 10, 10, 50]),
    'Y': np.array([20, 20, 40, 60]),
    'Z': np.array([6, 10, 10, 6])
})

mapping = {(x, y): z for (x, y, z) in data[["X", "Y", "Z"]].values}

n = len(data)
mat = np.zeros((n, n))

for i, x in np.ndenumerate(data["X"]):
    for j, y in np.ndenumerate(data["Y"]):
        mat[j, i] = mapping.get((x, y), 0)

print(mat)

输出:

[[ 6. 10. 10.  0.]
 [ 6. 10. 10.  0.]
 [ 0. 10. 10.  0.]
 [ 0.  0.  0.  6.]]

我正在创建与(x,y)⟶z的分配相对应的mapping

有了它,填充结果矩阵mat非常简单。

但是请注意,如果存在xy的值相同的多个列,则将采用最后一列的相应z值。

© www.soinside.com 2019 - 2024. All rights reserved.