【发布时间】:2016-12-14 21:11:48
【问题描述】:
我想将熊猫 SparseDataFrame 转换为 scipy.sparse.csc_matrix。但我不想先将其转换回密集矩阵。
现在我有类似下面的东西。
df = pd.get_dummies(df, sparse=True)
基本上我需要的是进一步从df 获得scipy.sparse.csc_matrix。有什么办法吗?
【问题讨论】:
我想将熊猫 SparseDataFrame 转换为 scipy.sparse.csc_matrix。但我不想先将其转换回密集矩阵。
现在我有类似下面的东西。
df = pd.get_dummies(df, sparse=True)
基本上我需要的是进一步从df 获得scipy.sparse.csc_matrix。有什么办法吗?
【问题讨论】:
感谢@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)
【讨论】:
我参加过各种sparse Pandas to scipy sparce questions。
有一种将多索引稀疏序列转换为 coo 矩阵的 Pandas 方法:
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 不同。
【讨论】: