2016-12-14 69 views
1

我想將pandas SparseDataFrame轉換爲scipy.sparse.csc_matrix。但我不想先將它轉換回密集矩陣。將Pandas SparseDataframe轉換爲Scipy sparse csc_matrix

現在我有類似下面的東西。

df = pd.get_dummies(df, sparse=True) 

基本上我需要的是進一步得到df一個scipy.sparse.csc_matrix。有沒有辦法做到這一點?

回答

0

我已經參加了各種稀疏的大熊貓scipy sparce問題。

有一個熊貓方法用於多指標稀疏系列轉換爲COO矩陣:

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

但見Pandas sparse dataFrame to sparse matrix, without generating a dense matrix in memory 用於數據幀到稀疏。

How do I create a scipy sparse matrix from a pandas dataframe?

以及最近How can I "sparsify" on two values?

一旦你有一個coo矩陣,你可以很容易地將其轉換爲csrcsc

爲了避免混淆,我建議創建一個示例數據框,轉換爲密集,然後稀疏。我們有一些具體的測試。我曾經推薦過Pandas方法,但沒有意識到MultiIndex與DataFrame不同。

+0

感謝回覆@hpaulj。如果我正確理解你,最好的方法應該是[熊貓稀疏dataFrame稀疏矩陣,而不會在內存中生成密集矩陣](http://stackoverflow.com/questions/31084942/pandas-sparse-dataframe-to-sparse-矩陣,而無需生成-A-稠密矩陣中-M)。對? –

1

感謝@ hpaulj的回覆。我使用https://stackoverflow.com/a/38157234/7298911的模板結束了它。

這裏是修改後的實現。

def sparseDfToCsc(df): 
    columns = df.columns 
    dat, rows = map(list,zip(*[(df[col].sp_values-df[col].fill_value, df[col].sp_index.to_int_index().indices) for col in columns])) 
    cols = [np.ones_like(a)*i for (i,a) in enumerate(dat)] 
    datF, rowsF, colsF = np.concatenate(dat), np.concatenate(rows), np.concatenate(cols) 
    arr = sparse.coo_matrix((datF, (rowsF, colsF)), df.shape, dtype=np.float64) 
    return arr.tocsc() 

df = pd.get_dummies(df, sparse=True) 
cscMatrix = sparseDfToCsc(df)