Pandas DataFrame与X,Y坐标为NumPy矩阵

时间:2017-08-11 17:34:58

标签: python pandas numpy

我有一个包含XYvalue列的数据框,例如:

   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中某些坐标的值

3 个答案:

答案 0 :(得分:8)

Pivot数据框和值应该是您所需要的:

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

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

答案 1 :(得分: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

答案 2 :(得分:2)

我会通过一个稀疏的坐标矩阵来做到这一点,这个矩阵基本上就是你的格式。

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