2013-07-23 31 views
27

Ich bemerkte, Pandas hat jetzt support for Sparse Matrices and Arrays. Derzeit erstelle ich DataFrame() s wie folgt aus:Füllen Sie einen Pandas SparseDataFrame aus einer SciPy Sparse Matrix

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

Gibt es eine Möglichkeit, eine SparseDataFrame() mit einem scipy.sparse.csc_matrix() oder csr_matrix() zu schaffen? Konvertieren in ein dichtes Format führt zu einem schlechten RAM-Verlust. Vielen Dank!

+1

Es gibt jetzt eine experimentelle API: http://pandas-docs.github.io/pandas-docs-travis/sparse.html#interaction-with-scipy- spärlich –

Antwort

23

Eine direkte Konvertierung wird ATM nicht unterstützt. Beiträge sind willkommen!

die Sie interessieren, sollten sich auf Speicher ok sein, da die SpareSeries viel wie ein csc_matrix ist (für 1 Spalte) und ziemlich platzspar

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 
+0

Super, danke! Ich denke nur laut darüber nach, aber da die SciPy-Sparse-Formate wirklich nur aus einem Array von Daten und zwei Arrays von Indizes bestehen, könnten wir den "SparseDataFrame" damit einfach pu- mulieren? – Will

+4

seine beste (in der aktuellen Implementierung) zu füllen pro Serie (Spalte); Das erzeugt dann im Grunde einen internen Index (einen int-Index genannt) oder einen Block-Index (ähnlich wie bsr/csr), um die Werte zu lokalisieren. An was für Operationen denken Sie? – Jeff

+0

Würde dies für eine CSR-Matrix anders sein oder ist dies immer noch der empfohlene Weg? – Sid

-10

eine viel kürzere Version:

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

Leider verwandelt 'toarray()' eine spärliche Matrix in eine dichte Matrix und verwendet lächerliche Mengen an Speicher. – Will

8

Wie von Pandas v 0.20.0 können Sie den SparseDataFrame Konstruktor verwenden.

Ein Beispiel aus the 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) 
Verwandte Themen