2017-08-12 63 views
1

我有熊貓數據幀3列value,row_index,column_index。我想創建一個矩陣,其中放置在相關行和列以及未知元素的數據幀的值爲零。如何在2d矩陣中放置值od數據幀列?

我已經做了的週期是這樣的:

N_rows = df.row_index.max() 
N_cols = df.column_index.max() 
A = np.zeros((N_rows, N_cols)) 
for i in df.row_index: 
    for j in df.column_index: 
     np.put(A, i*N_cols+j, df['value'][(df.row_index==i) & 
              (df.column_index==j)]) 

,但它的工作原理很慢。

我該如何做得更快?

+0

嘗試'array = df.fillna(0).values' –

回答

0

只需修改@ jezrael解決方案中的小部分即可。你實際上可以使用熊貓as_matrix()函數來獲得陣列:

df = pd.DataFrame({'value':[2,4,5], 
        'row_index':[2,3,4], 
        'col_index':[0,2,3]}) 

df.pivot('row_index', 'col_index', 'value').fillna(0).as_matrix() 
# array([[ 2., 0., 0.], 
#  [ 0., 4., 0.], 
#  [ 0., 0., 5.]]) 
1

我認爲你需要pivotfillna和失蹤列的值和行添加reindex,持續numpy的陣列添加values

df = pd.DataFrame({'value':[2,4,5], 
        'row_index':[2,3,4], 
        'col_index':[0,2,3]}) 

print (df) 
    col_index row_index value 
0   0   2  2 
1   2   3  4 
2   3   4  5 

rows = np.arange(df.row_index.max()+1) 
cols = np.arange(df.col_index.max()+1) 

print (df.pivot('row_index', 'col_index', 'value') 
     .fillna(0) 
     .reindex(index=rows, columns=cols, fill_value=0)) 
col_index 0 1 2 3 
row_index      
0   0.0 0.0 0.0 0.0 
1   0.0 0.0 0.0 0.0 
2   2.0 0.0 0.0 0.0 
3   0.0 0.0 4.0 0.0 
4   0.0 0.0 0.0 5.0 

a = df.pivot('row_index', 'col_index', 'value') 
     .fillna(0) 
     .reindex(index=rows, columns=cols, fill_value=0) 
     .values 
print (a) 
[[ 0. 0. 0. 0.] 
[ 0. 0. 0. 0.] 
[ 2. 0. 0. 0.] 
[ 0. 0. 4. 0.] 
[ 0. 0. 0. 5.]] 

另一種解決方案與set_indexunstack

print (df.set_index(['row_index', 'col_index'])['value'] 
     .unstack(fill_value=0) 
     .reindex(index=rows, columns=cols, fill_value=0)) 

col_index 0 1 2 3 
row_index    
0   0 0 0 0 
1   0 0 0 0 
2   2 0 0 0 
3   0 0 4 0 
4   0 0 0 5 


a = df.set_index(['row_index', 'col_index'])['value'] 
     .unstack(fill_value=0) 
     .reindex(index=rows, columns=cols, fill_value=0) 
     .values 
print (a) 
[[0 0 0 0] 
[0 0 0 0] 
[2 0 0 0] 
[0 0 4 0] 
[0 0 0 5]]