2013-06-10 7 views
3

Я пытаюсь создать сводную таблицу из массива Numpy в python. Я провел много исследований, но я не могу найти прямого решения. Я знаю, что вы можете сделать это с Pandas, но у меня возникли проблемы с его установкой - но, возможно, это можно сделать без Pandas. Мой Numpy массивpython - создать сводную таблицу

[[ 4057  8 1374] 
[ 4057  9 759] 
[ 4057 11 96] 
..., 
[89205 16 146] 
[89205 17 154] 
[89205 18 244]] 

мне нужна сводная таблица, где строки находятся в первом столбце, столбцы второго столбец и значение в третьей колонке. Помоги пожалуйста!

Благодаря

ответ

9

Я думаю, что это то, что вы хотите:

data = np.array([[ 4057,  8, 1374], 
       [ 4057,  9, 759], 
       [ 4057, 11, 96], 
       [89205, 16, 146], 
       [89205, 17, 154], 
       [89205, 18, 244]]) 

rows, row_pos = np.unique(data[:, 0], return_inverse=True) 
cols, col_pos = np.unique(data[:, 1], return_inverse=True) 

pivot_table = np.zeros((len(rows), len(cols)), dtype=data.dtype) 
pivot_table[row_pos, col_pos] = data[:, 2] 

>>> pivot_table 
array([[1374, 759, 96, 0, 0, 0], 
     [ 0, 0, 0, 146, 154, 244]]) 
>>> rows 
array([ 4057, 89205]) 
>>> cols 
array([ 8, 9, 11, 16, 17, 18]) 

Есть некоторые ограничения этого подхода, главное в том, что, если вы повторили записи для одной и той же комбинации строк/столбцов, они не будут добавлены вместе, но только один (возможно, последний) будет сохранен. Если вы хотите добавить их все вместе, хотя и немного запутано, вы можете злоупотреблять разреженным модулем Scipy:

data = np.array([[ 4057,  8, 1374], 
       [ 4057,  9, 759], 
       [ 4057, 11, 96], 
       [89205, 16, 146], 
       [89205, 17, 154], 
       [89205, 18, 244], 
       [ 4057, 11,  4]]) 

rows, row_pos = np.unique(data[:, 0], return_inverse=True) 
cols, col_pos = np.unique(data[:, 1], return_inverse=True) 

pivot_table = np.zeros((len(rows), len(cols)), dtype=data.dtype) 
pivot_table[row_pos, col_pos] = data[:, 2] 
>>> pivot_table # the element at [0, 2] should be 100!!! 
array([[1374, 759, 4, 0, 0, 0], 
     [ 0, 0, 0, 146, 154, 244]]) 

import scipy.sparse as sps 
pivot_table = sps.coo_matrix((data[:, 2], (row_pos, col_pos)), 
          shape=(len(rows), len(cols))).A 
>>> pivot_table # now repeated elements are added together 
array([[1374, 759, 100, 0, 0, 0], 
     [ 0, 0, 0, 146, 154, 244]]) 
+0

похоже, что это сработало, спасибо! – user1893354

+0

К счастью, мои данные таковы, что никогда не должно быть повторной записи, как вы упомянули – user1893354

Смежные вопросы