我有一个包含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
我需要将其转换为DataFrame为NumPy矩阵:
[[56, 13, 25, ...],
[ 7, 18, ...],
...,
[ 91, ... , 32]]
我知道我可以迭代DataFrame的每个单元格,但这太慢了。这样做的有效方法是什么?
另请注意:缺少DataFrame中某些坐标的值
答案 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)