将Pandas SparseDataframe转换为Scipy稀疏csc_matrix

3
我希望将Pandas的SparseDataFrame转换为scipy.sparse.csc_matrix。但我不想先将其转换为密集矩阵。
现在我的代码如下所示:
df = pd.get_dummies(df, sparse=True)

我需要的是从 df 进一步获得一个 scipy.sparse.csc_matrix。有什么方法可以做到吗?

2个回答

1
感谢@hpaulj的回复。最终我使用了https://dev59.com/eV0Z5IYBdhLWcg3wxCqQ#38157234中的模板。
以下是修改后的实现。
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)

0

我参与了各种关于Pandas到scipy稀疏问题的讨论。

Pandas有一种方法可以将多索引稀疏系列转换为coo矩阵:

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

但是请参见Pandas稀疏DataFrame转换为稀疏矩阵,而不在内存中生成密集矩阵以获取数据框转换为稀疏矩阵的方法。

还有

如何从Pandas数据框创建scipy稀疏矩阵?

最近,如何在两个值上进行“稀疏化”?

一旦您拥有一个coo矩阵,您可以轻松地将其转换为csrcsc

为避免混淆,我建议创建一个示例数据框,将其转换为密集矩阵,然后再转换为稀疏矩阵。这样我们就有了具体的测试对象。我曾经推荐过Pandas方法,但没有意识到MultiIndex与DataFrame不同。


感谢@hpaulj的回复。如果我理解正确,最好的方法应该是Pandas稀疏DataFrame转换为稀疏矩阵,而不生成内存中的密集矩阵。对吗? - Han Fang

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接