Scipy稀疏矩阵作为DataFrame列

时间:2016-09-12 03:30:49

标签: python pandas dataframe scipy sparse-matrix

我正在开发基于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。

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

2 个答案:

答案 0 :(得分:1)

有一个稀疏的数据框或数据集功能。它仍然是实验性的。我已经回答了一些关于在scipy稀疏矩阵之间来回转换的问题。

从侧栏:

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的字典。

答案 1 :(得分:0)

诚然,这不能完全回答您的问题,但是如果有人正在寻找一种快速的解决方法,并且不介意将矩阵低密度地存储为低密度,可以这样做:

df = pd.DataFrame(X=ma.todense().tolist())
相关问题