直接将 Pandas 数据帧转换为稀疏 Numpy 矩阵

Posted

技术标签:

【中文标题】直接将 Pandas 数据帧转换为稀疏 Numpy 矩阵【英文标题】:Convert Pandas dataframe to Sparse Numpy Matrix directly 【发布时间】: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 直接到稀疏矩阵?

提前致谢。

【问题讨论】:

【参考方案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) 将密集数据帧转换为稀疏数据帧

以上是关于直接将 Pandas 数据帧转换为稀疏 Numpy 矩阵的主要内容,如果未能解决你的问题,请参考以下文章

如何将稀疏的 pandas 数据帧转换为 2d numpy 数组

将 CountVectorizer 和 TfidfTransformer 稀疏矩阵转换为单独的 Pandas 数据帧行

将结构化 numpy 数组(包含子数组)转换为 pandas 数据帧

Pandas sklearn one-hot 编码数据帧或 numpy?

将 Numpy 数组按列转换为 Pandas DataFrame(作为单行)

以内存有效的方式将大型 csv 读入稀疏的 pandas 数据帧