直接将 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?