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}新数组的总大小必须保持不变
,可能是因为数据帧包含缺少的值。