Python 将具有X、Y坐标的数据帧转换为NumPy矩阵

Python 将具有X、Y坐标的数据帧转换为NumPy矩阵,python,pandas,numpy,Python,Pandas,Numpy,我有一个带有列X、Y和value的数据框,例如: X | Y | value ------------------ 1 | 1 | 56 2 | 1 | 13 3 | 1 | 25 ... | ... | ... 1 | 2 | 7 2 | 2 | 18 ... | ... | ... 1 | 123 | 91 ... | ... | ... 50 | 123 |

我有一个带有列
X
Y
value
的数据框,例如:

   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]]
我知道我可以迭代数据帧的每个单元格,但这太慢了。这样做的有效方法是什么

另请注意:数据框中某些坐标的值缺少数据框,这些值应该是您需要的:

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

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

使用
设置索引

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.]])
,使用
交叉表

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\u table

我会通过一个稀疏的坐标矩阵来实现这一点,它基本上就是您的格式

注意,如果转换为数组,缺少的点将存储为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)

您是否尝试了类似于
df.value.values.reformate(-1,ncols)
?numpyMatrix=df.as_matrix()@Divakar不工作,我得到了
{ValueError}新数组的总大小必须保持不变
,可能是因为数据帧包含缺少的值。