2017-08-11 77 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)