我想將pandas SparseDataFrame
轉換爲scipy.sparse.csc_matrix
。但我不想先將它轉換回密集矩陣。將Pandas SparseDataframe轉換爲Scipy sparse csc_matrix
現在我有類似下面的東西。
df = pd.get_dummies(df, sparse=True)
基本上我需要的是進一步得到df
一個scipy.sparse.csc_matrix
。有沒有辦法做到這一點?
我想將pandas SparseDataFrame
轉換爲scipy.sparse.csc_matrix
。但我不想先將它轉換回密集矩陣。將Pandas SparseDataframe轉換爲Scipy sparse csc_matrix
現在我有類似下面的東西。
df = pd.get_dummies(df, sparse=True)
基本上我需要的是進一步得到df
一個scipy.sparse.csc_matrix
。有沒有辦法做到這一點?
我已經參加了各種稀疏的大熊貓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
矩陣,你可以很容易地將其轉換爲csr
或csc
。
爲了避免混淆,我建議創建一個示例數據框,轉換爲密集,然後稀疏。我們有一些具體的測試。我曾經推薦過Pandas方法,但沒有意識到MultiIndex與DataFrame不同。
感謝@ 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)
感謝回覆@hpaulj。如果我正確理解你,最好的方法應該是[熊貓稀疏dataFrame稀疏矩陣,而不會在內存中生成密集矩陣](http://stackoverflow.com/questions/31084942/pandas-sparse-dataframe-to-sparse-矩陣,而無需生成-A-稠密矩陣中-M)。對? –