Scipy稀疏矩阵作为DataFrame列

我正在开发基于pandas DataFrame对象的工具 . 我希望将scipy稀疏矩阵作为DataFrame的列保留,而不是将其逐行转换为dtype('O')的list / numpy数组 .

下面的代码段不起作用,因为pandas将矩阵视为标量,并建议添加索引 . 当在矩阵中的行索引上提供pd.RangeIndex时,对于数据帧中的每一行重复矩阵(因为pandas认为它是标量) .

ma = scipy.sparse.rand(10, 100, 0.1, 'csr', dtype=np.float64)
df = pd.DataFrame(dict(X=ma))

这确实有效:

df = pd.DataFrame(dict(X=list(ma)))

然而,这将矩阵逐行划分为每行1行的CSR矩阵 . 每当我想要处理原始矩阵时,我就需要进行vstack .

有什么指针吗?我尝试将CSR矩阵包装到pd.Series对象中,假装它有dtype('O'),但我对基础数据进行了很多假设,这些假设是numpy数组等等 .

回答(2)

2 years ago

存在稀疏数据框或数据集功能 . 它仍然是实验性的 . 我已经回答了几个关于在稀疏矩阵和稀疏矩阵之间来回转换的SO问题 .

从侧边栏:

Populate a Pandas SparseDataFrame from a SciPy Sparse Coo Matrix

没有这种专门的熊猫结构,我不知道如何将稀疏矩阵添加到熊猫框架中 . 稀疏矩阵的内部结构太不同了 . 首先,它不是numpy数组的子类 .

csr 矩阵是一个对象,其数据包含在3个数组中, ma.datama.indices 是1d数组,每个数组的非零元素都有一个值 . ma.indptr 具有矩阵每行的值 .

list(ma) 毫无意义 . ma.toarray() 生成一个具有相同数据的二维数组,并且所有这些零也将被填充 .

其他稀疏矩阵格式将其数据存储在其他结构中 - 用于 coo 的3个等长数组,用于 lil 的两个列表列表和用于 dok 的字典 .

2 years ago

不可否认,这并不能完全回答你的问题,但是如果有人正在寻找快速的解决方法,并且不介意将矩阵存储得不够高效,那么可以这样做:

df = pd.DataFrame(X=ma.todense().tolist())