В настоящее время я не вижу, как это сделать быстрее, чем с двумя for-l oop. Это должно работать:
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.]]
Я создаю mapping
, что соответствует присвоению (x, y ) ⟶ z .
При этом заполнение матрицы результатов mat
довольно просто.
Обратите внимание, что если существует несколько столбцов с одинаковым для значений x
и y
будет принято соответствующее значение z
последнего столбца.