我在数据框中有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
--------------------
我目前看不到如何比使用两个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
非常简单。
但是请注意,如果存在x
和y
的值相同的多个列,则将采用最后一列的相应z
值。