2013-07-23 10 views
27

私は今パンダにsupport for Sparse Matrices and Arraysがあることに気付きました。現在、私はこのようなDataFrame() Sを作成します。SciPyスパース行列からPandas SparseDataFrameにデータを取り入れる

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

scipy.sparse.csc_matrix()またはcsr_matrix()SparseDataFrame()を作成する方法はありますか?密なフォーマットに変換すると、RAMがひどく殺されます。ありがとう!

+1

実験APIが用意されました疎な –

答えて

23

ATMでは直接変換はサポートされていません。貢献は歓迎です!

SpareSeriesとしてメモリ上の[OK]をする必要があり、これを試してみてください(1列用)csc_matrixよく似ている とかなりのスペース効率的

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

素晴らしい、ありがとう! SciPy Sparseのフォーマットは実際にはデータの配列とインデックスの2つの配列なので、ここではSparseDataFrameを使っていますか? – Will

+4

(現在の実装では)シリーズ(列)ごとに最適な値を設定します。基本的に内部インデックス(intインデックス)またはブロックインデックス(bsr/csrのようなソート)を作成して値を探します。あなたはどんな種類の作業をしていますか? – Jeff

+0

これはcsrマトリックスでは違うでしょうか、これは今でも推奨されていますか? – Sid

-10

はるかに短いバージョン:

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

残念ながら、 'toarray()'は疎行列を密行列に変換し、ばかげた量のメモリを使います。 – Will

8

として、 pandas v 0.20.0の場合、SparseDataFrameコンストラクタを使用できます。 the pandas docsから

例:http://pandas-docs.github.io/pandas-docs-travis/sparse.html#interaction-with-scipy-:

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) 
関連する問題