【问题标题】:Populate a Pandas SparseDataFrame from a SciPy Sparse Matrix从 SciPy 稀疏矩阵填充 Pandas SparseDataFrame
【发布时间】:2013-07-23 00:43:21
【问题描述】:

我注意到 Pandas 现在有 support for Sparse Matrices and Arrays。目前,我这样创建DataFrame()s:

return DataFrame(matrix.toarray(), columns=features, index=observations)

有没有办法用scipy.sparse.csc_matrix()csr_matrix() 创建SparseDataFrame()?转换为密集格式会严重破坏 RAM。谢谢!

【问题讨论】:

标签: python numpy scipy pandas sparse-matrix


【解决方案1】:

ATM 不支持直接转换。欢迎投稿!

试试这个,在内存上应该没问题,因为 SpareSeries 很像 csc_matrix(1 列) 并且非常节省空间

In [37]: col = np.array([0,0,1,2,2,2])

In [38]: data = np.array([1,2,3,4,5,6],dtype='float64')

In [39]: m = csc_matrix( (data,(row,col)), shape=(3,3) )

In [40]: m
Out[40]: 
<3x3 sparse matrix of type '<type 'numpy.float64'>'
        with 6 stored elements in Compressed Sparse Column format>

In [46]: pd.SparseDataFrame([ pd.SparseSeries(m[i].toarray().ravel()) 
                              for i in np.arange(m.shape[0]) ])
Out[46]: 
   0  1  2
0  1  0  4
1  0  0  5
2  2  3  6

In [47]: df = pd.SparseDataFrame([ pd.SparseSeries(m[i].toarray().ravel()) 
                                   for i in np.arange(m.shape[0]) ])

In [48]: type(df)
Out[48]: pandas.sparse.frame.SparseDataFrame

【讨论】:

  • 太棒了,谢谢!只是在这里大声思考,但由于 SciPy Sparse 格式实际上只是一个数据数组和两个索引数组,我们能否以某种方式仅用它填充 SparseDataFrame
  • 最好(在当前实现中)填充每个系列(列);然后基本上创建一个内部索引(称为 int 索引)或块索引(有点像 bsr/csr)来定位值。你打算做什么样的操作?
  • 这对于 csr 矩阵会有所不同还是仍然是推荐的方式?
  • 杰夫,在我的情况下,使用这种方法不会节省内存,如果我像这样创建数据框,调用 df.memory_usage().sum() 是一样的:pd.DataFrame(mtx.todense())。但是,如果我在这里添加to_sparse 方法pd.DataFrame(mtx.todense()).to_sparse(fill_value=0) 并再次调用df.memory_usage().sum(),则它会更少。也许这很容易回答,但我有点卡住了。
  • 不太确定你在做什么,这是一个相当旧的版本。尝试使用较新的 pandas,如果没有,请打开问题/SO 问题。
【解决方案2】:

从 pandas v 0.20.0 开始,您可以使用 SparseDataFrame 构造函数。

来自the pandas docs的例子:

import numpy as np
import pandas as pd
from scipy.sparse import csr_matrix

arr = np.random.random(size=(1000, 5))
arr[arr < .9] = 0
sp_arr = csr_matrix(arr)
sdf = pd.SparseDataFrame(sp_arr)

【讨论】:

    【解决方案3】:

    一个更短的版本:

    df = pd.DataFrame(m.toarray())
    

    【讨论】:

    • 不幸的是,toarray() 将稀疏矩阵转换为稠密矩阵,并占用大量内存。
    • 这是简单而简短的代码,对于我相对较小的数据集,内存消耗是可以接受的折衷方案。
    猜你喜欢
    • 2016-03-14
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 2017-03-31
    • 1970-01-01
    • 2014-05-12
    • 2018-05-06
    • 2017-03-26
    相关资源
    最近更新 更多