Как я могу преобразовать столбец в pandas 3-столбцов данных в матричный формат в Python? - PullRequest
0 голосов
/ 12 апреля 2020

В моем фрейме данных есть 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
--------------------

1 Ответ

0 голосов
/ 12 апреля 2020

В настоящее время я не вижу, как это сделать быстрее, чем с двумя 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 последнего столбца.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...