从SciPy Sparse Matrix填充一个Pandas SparseDataFrame
我注意到pandas现在支持稀疏matrix和数组 。 目前,我创buildDataFrame()
如下所示:
return DataFrame(matrix.toarray(), columns=features, index=observations)
有没有办法用scipy.sparse.csc_matrix()
或csr_matrix()
创build一个csr_matrix()
? 转换为密集格式严重杀死RAM。 谢谢!
不支持直接转换。 贡献是值得欢迎的!
试试这个,在内存上应该没问题,因为SpareSeries很像csc_matrix(对于1列)和相当高效的空间
In [37]: col = np.array([0,0,1,2,2,2]) In [38]: data = np.array([1,2,3,4,5,6],dtype='float64') In [39]: m = csc_matrix( (data,(row,col)), shape=(3,3) ) In [40]: m Out[40]: <3x3 sparse matrix of type '<type 'numpy.float64'>' with 6 stored elements in Compressed Sparse Column format> In [46]: pd.SparseDataFrame([ pd.SparseSeries(m[i].toarray().ravel()) for i in np.arange(m.shape[0]) ]) Out[46]: 0 1 2 0 1 0 4 1 0 0 5 2 2 3 6 In [47]: df = pd.SparseDataFrame([ pd.SparseSeries(m[i].toarray().ravel()) for i in np.arange(m.shape[0]) ]) In [48]: type(df) Out[48]: pandas.sparse.frame.SparseDataFrame
从pandas v 0.20.0开始,您可以使用SparseDataFrame
构造函数。
来自pandas文档的一个例子:
import numpy as np import pandas as pd from scipy.sparse import csr_matrix arr = np.random.random(size=(1000, 5)) arr[arr < .9] = 0 sp_arr = csr_matrix(arr) sdf = pd.SparseDataFrame(sp_arr)
一个更短的版本:
df = pd.DataFrame(m.toarray())