2015-11-17 178 views
3

可能是一個非常簡單的問題,但我無法想出一個解決方案。 我有一個數據框9列和〜100000行。數據是從圖像中提取的,因此兩列(「行」和「列」)指的是數據的像素位置。如何創建numpy數組A,使行和列指向另一列中的另一個數據項,例如「壞脾氣」?從Pandas dataframe創建二維數組

A[row, col] 
# 0.1232 

我想避免for循環或類似的東西。

回答

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'] 

採樣運行 -

>>> 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對重複,它將平均結果。也就是說,對於大型數據集,這通常比基於索引的方法快得多。