2017-08-11 67 views
0

我有YX,並且value,例如數據幀:熊貓據幀與X,Y座標NumPy的矩陣

X | Y | value 
------------------ 
    1 | 1 | 56 
    2 | 1 | 13 
    3 | 1 | 25 
... | ... | ... 
    1 | 2 |  7 
    2 | 2 | 18 
... | ... | ... 
    1 | 123 | 91 
... | ... | ... 
    50 | 123 | 32 

我需要將其轉換爲數據幀的NumPy的矩陣:

[[56, 13, 25, ...], 
[ 7, 18,  ...], 
..., 
[ 91, ... , 32]] 

我知道我可以迭代DataFrame的每個單元格,但這太慢了。這樣做的有效方法是什麼?

還要注意:在數據幀的一些座標值丟失

+0

你是否嘗試過'df.value.values.reshape(-1,ncols)'這一行? – Divakar

+0

numpyMatrix = df.as_matrix() – Hound

+0

@Divakar不工作,我得到'{ValueError}新數組的總大小必須保持不變',可能是因爲DataFrame包含缺失值。 – Peter

回答

6

Pivot的數據幀和值應該是你需要的東西:

df.pivot('Y', 'X', 'value').values 

#array([[ 56., 13., 25., nan], 
#  [ 7., 18., nan, nan], 
#  [ 91., nan, nan, 32.]]) 
3

使用​​

In [501]: df.set_index(['Y', 'X']).unstack().values 
Out[501]: 
array([[ 56., 13., 25., nan], 
     [ 7., 18., nan, nan], 
     [ 91., nan, nan, 32.]]) 

或者,使用groupby

In [493]: df.groupby(['Y', 'X'])['value'].sum().unstack().values 
Out[493]: 
array([[ 56., 13., 25., nan], 
     [ 7., 18., nan, nan], 
     [ 91., nan, nan, 32.]]) 

或者,使用crosstab

In [500]: pd.crosstab(index=df.Y, columns=df.X, values=df.value, aggfunc='sum').values 
Out[500]: 
array([[ 56., 13., 25., nan], 
     [ 7., 18., nan, nan], 
     [ 91., nan, nan, 32.]]) 

或者,使用pd.pivot_table在另一個答案指出。

1

我會通過經歷一個稀疏的座標矩陣,這基本上是你有的格式。

注意,如果轉換爲數組,則丟失的點將存儲爲0。

如果您缺少一噸重物,根據您的下游流程,爲了記憶或性能原因而堅持使用稀疏矩陣可能會更好。

x = pd.DataFrame({'X':[1,2,3,1,2,1,4], 'Y':[1,1,1,2,2,3,3], 'Z':[56,13,25,7,18,91,32]}) 

#import coo from sparse 
from scipy.sparse import coo_matrix 
#it works like (data,(y,x)) 
out = coo_matrix((x.Z,(x.Y-1,x.X-1))) #-1, as you aren't 0 indexed above 
#if you really don't want sparse turn it to an array: 
out.toarray() 
array([[56, 13, 25, 0], 
     [ 7, 18, 0, 0], 
     [91, 0, 0, 32]], dtype=int64)