将Pandas SparseDataframe转换为Scipy稀疏csc_matrix

时间:2016-12-14 21:11:48

标签: python pandas numpy scipy

我想将大熊猫SparseDataFrame转换为scipy.sparse.csc_matrix。但我不想先将它转换回密集矩阵。

现在我有类似下面的内容。

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

基本上我需要的是从scipy.sparse.csc_matrix进一步获得df。有办法吗?

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分:0)

我参加了各种稀疏的熊猫来解决sparce问题。

有一个Pandas方法可以将multiindex稀疏序列转换为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不同。