web-dev-qa-db-fra.com

Remplissez un Pandas SparseDataFrame à partir d'une matrice éparse SciPy

J'ai remarqué Pandas a maintenant prise en charge des matrices et des tableaux clairsemés . Actuellement, je crée DataFrame() s comme ceci:

return DataFrame(matrix.toarray(), columns=features, index=observations)

Existe-t-il un moyen de créer une SparseDataFrame() avec une scipy.sparse.csc_matrix() ou csr_matrix()? La conversion au format dense tue RAM mal. Merci!

35
Will

Une conversion directe n'est pas prise en charge ATM. Les contributions sont les bienvenues!

Essayez ceci, devrait être correct sur la mémoire car la SpareSeries ressemble beaucoup à une csc_matrix (pour 1 colonne) et assez économe en espace

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
30
Jeff

Depuis pandas v 0.20.0, vous pouvez utiliser le constructeur SparseDataFrame.

Un exemple de les 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)
19
Alex