Pandas数据帧中含有X、Y坐标的转换为NumPy矩阵。

3

我有一个包含列 XYvalue 的 DataFrame,例如:

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

我需要将这个DataFrame转换成一个NumPy矩阵:

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

我知道我可以迭代DataFrame的每个单元格,但那太慢了。有什么更有效的方法吗?

另外请注意:DataFrame中某些坐标的值是缺失的。


你尝试过类似于 df.value.values.reshape(-1,ncols) 这样的东西吗? - Divakar
numpyMatrix = df.as_matrix() - Hound
@Divakar 不起作用,我得到了 {ValueError}total size of new array must be unchanged,可能是因为 DataFrame 包含缺失值。 - Peter
3个回答

13

透视数据框,所需数值应为所需内容:

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

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

4
我会通过遍历一个稀疏矩阵来实现这个功能,这基本上是你所拥有的格式。
请注意,如果您将其转换为数组,则缺少的位置将存储为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)

3
使用 set_index
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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接