2015-11-17 4 views
3

Вероятно, очень простой вопрос, но я не мог найти решение. У меня есть кадр данных с 9 столбцами и ~ 100000 строк. Данные были извлечены из изображения, так что два столбца ('row' и 'col') относятся к положению пикселей данных. Как создать массив numpy A, чтобы строка и столбец указывали на другую запись данных в другом столбце, например. «Сварливость»?Создание 2D-массива из кадра данных Pandas

A[row, col] 
# 0.1232 

Я хочу избежать петли или чего-то подобного.

ответ

5

Вы могли бы сделать что-то вроде этого -

# Extract row and column information 
rowIDs = df['row'] 
colIDs = df['col'] 

# Setup image array and set values into it from "grumpiness" column 
A = np.zeros((rowIDs.max()+1,colIDs.max()+1)) 
A[rowIDs,colIDs] = df['grumpiness'] 

Sample пробег -

>>> df 
    row col grumpiness 
0 5 0 0.846412 
1 0 1 0.703981 
2 3 1 0.212358 
3 0 2 0.101585 
4 5 1 0.424694 
5 5 2 0.473286 
>>> A 
array([[ 0.  , 0.70398113, 0.10158488], 
     [ 0.  , 0.  , 0.  ], 
     [ 0.  , 0.  , 0.  ], 
     [ 0.  , 0.21235838, 0.  ], 
     [ 0.  , 0.  , 0.  ], 
     [ 0.84641194, 0.42469369, 0.47328598]]) 
4

Один очень быстрый и простой способ сделать это состоит в использовании pivot_table:

>>> df 
    row col grumpiness 
0 5 0 0.846412 
1 0 1 0.703981 
2 3 1 0.212358 
3 0 2 0.101585 
4 5 1 0.424694 
5 5 2 0.473286 

>>> df.pivot_table('grumpiness', 'row', 'col', fill_value=0) 
col   0   1   2 
row        
0 0.000000 0.703981 0.101585 
3 0.000000 0.212358 0.000000 
5 0.846412 0.424694 0.473286 

Обратите внимание, что если какие-либо полные строки/столбцы отсутствуют, они не будут отображаться, и если какая-либо строка/c ol повторяется, это усредняет результаты. Тем не менее, это будет намного быстрее для более крупных наборов данных, чем подход, основанный на индексации.

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