从SciPy稀疏矩阵填充Pandas SparseDataFrame

Wil*_*ill 34 python numpy scipy sparse-matrix pandas

我注意到Pandas现在支持Sparse Matrices和Arrays.目前,我创建DataFrame()如下:

return DataFrame(matrix.toarray(), columns=features, index=observations)
Run Code Online (Sandbox Code Playgroud)

有没有办法创建SparseDataFrame()一个scipy.sparse.csc_matrix()csr_matrix()?转换为密集格式会严重影响RAM.谢谢!

Jef*_*eff 29

ATM不支持直接转换.欢迎捐款!

试试这个,内存应该没问题,因为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
Run Code Online (Sandbox Code Playgroud)

  • 每个系列(列)的最佳填充(在当前实现中); 然后基本上创建一个内部索引(称为int索引)或块索引(类似于bsr/csr)来定位值.你在做什么样的行动? (4认同)

Ale*_*lex 19

从pandas v 0.20.0开始,您可以使用SparseDataFrame构造函数.

来自pandas docs的一个例子:

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)
Run Code Online (Sandbox Code Playgroud)