【问题标题】:Convert Pandas dataframe to Sparse Numpy Matrix directly直接将 Pandas 数据帧转换为稀疏 Numpy 矩阵
【发布时间】:2013-12-25 21:47:21
【问题描述】:

我正在从 Pandas 数据框创建一个矩阵,如下所示:

dense_matrix = np.array(df.as_matrix(columns = None), dtype=bool).astype(np.int)

然后变成一个稀疏矩阵:

sparse_matrix = scipy.sparse.csr_matrix(dense_matrix)

有没有办法从 df 直接到稀疏矩阵?

提前致谢。

【问题讨论】:

    标签: python numpy pandas scipy


    【解决方案1】:

    df.values 是一个 numpy 数组,以这种方式访问​​值总是比 np.array 快。

    scipy.sparse.csr_matrix(df.values)
    

    您可能需要先进行转置,例如 df.values.T。在 DataFrames 中,列是轴 0。

    【讨论】:

    • 但这是假设生成一个内存副本,不是吗?由于 df.values 本质上是返回一个密集矩阵,并转换为 csr_matrix 句柄。它不适用于大型矩阵。
    • 不,如果我理解正确df.values 不会复制。
    • 另一种方法是做例如df.replace(0, np.nan).to_sparse(),虽然结果是稀疏的 DataFrame,而不是 scipy.sparse.csr_matrix ...
    • 如果 df 是 SparseDataFrame,df.values 创建一个密集矩阵。对于大型数据集是不切实际的。
    • @Stan 在数据集非常大的情况下有什么解决方案吗?
    【解决方案2】:

    有一种方法可以做到这一点,而无需在途中转换为密集: csr_sparse_matrix = df.sparse.to_coo().tocsr()

    【讨论】:

    • 我得到了这个错误:AttributeError: Can only use the '.sparse' accessor with Sparse data.我认为pandas不允许直接运行它。
    • df 必须是稀疏数据框。通过:sparse_df = df.astype(pd.SparseDtype("float64",0) 将密集数据帧转换为稀疏数据帧
    猜你喜欢
    • 2016-09-19
    • 2016-08-03
    • 2020-04-07
    • 2021-11-25
    • 2021-02-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-21
    • 2015-09-14
    相关资源
    最近更新 更多