我正在开发基于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数组等等。
答案 0 :(得分:1)
有一个稀疏的数据框或数据集功能。它仍然是实验性的。我已经回答了一些关于在scipy
稀疏矩阵之间来回转换的问题。
从侧栏:
Populate a Pandas SparseDataFrame from a SciPy Sparse Coo Matrix
如果没有这种专门的熊猫结构,我不知道如何将稀疏矩阵添加到熊猫框架中。稀疏矩阵的内部结构太不同了。首先,它不是numpy数组的子类。
csr
矩阵是一个对象,数据包含在3个数组中,ma.data
和ma.indices
是1d数组,每个数组的非零元素都有一个值。 ma.indptr
为矩阵的每一行都有一个值。
list(ma)
毫无意义。 ma.toarray()
生成一个具有相同数据的二维数组,并且所有这些零也都会被填充。
其他稀疏矩阵格式将其数据存储在其他结构中 - coo
的3个等长数组,lil
的两个列表列表以及dok
的字典。
答案 1 :(得分:0)
诚然,这不能完全回答您的问题,但是如果有人正在寻找一种快速的解决方法,并且不介意将矩阵低密度地存储为低密度,可以这样做:
df = pd.DataFrame(X=ma.todense().tolist())