python numpy scipy pandas sparse-matrix

python - Llene un SparseDataFrame de Pandas desde una SciPy Sparse Matrix



numpy sparse-matrix (3)

Noté que Pandas ahora tiene soporte para matrices y matrices dispersas . Actualmente, creo DataFrame() como este:

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

¿Hay alguna manera de crear un SparseDataFrame() con scipy.sparse.csc_matrix() o csr_matrix() ? Conversión a formato denso mata RAM mal. ¡Gracias!


A partir de pandas v 0.20.0, puede usar el constructor SparseDataFrame .

Un ejemplo de los documentos de 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)


Una conversión directa no es compatible con ATM. ¡Las contribuciones son bienvenidas!

Pruebe esto, debería estar bien en la memoria ya que SpareSeries es muy parecido a csc_matrix (para 1 columna) y bastante eficiente en el espacio

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


Una versión mucho más corta:

df = pd.DataFrame(m.toarray())