python - pandas 对 SparseSeries 列表的内存使用情况

标签 python numpy pandas scipy

我正在尝试从稀疏 numpy 矩阵创建 SparseSeries 列表。创建 lil_matrix 速度很快,并且不会消耗大量内存(实际上,我的维度更多是数百万个量级,即 1500 万个样本和 400 万个特征)。我读过以前的topic关于这一点。但该解决方案似乎也耗尽了我所有的内存,卡住了我的计算机。从表面上看,pandas SparseSeries 看起来并不真正稀疏,还是我做错了什么?最终目标是从中创建一个 SparseDataFrame(就像我提到的其他主题一样)。

from scipy.sparse import lil_matrix, csr_matrix
from numpy import random
import pandas as pd

nsamples = 10**5
nfeatures = 10**4
rm = lil_matrix((nsamples,nfeatures))
for i in xrange(nsamples):
  index = random.randint(0,nfeatures,size=4)
  rm[i,index] = 1 

l=[]
for i in xrange(nsamples):
  l.append(pd.Series(rm[i,:].toarray().ravel()).to_sparse(fill_value=0))

最佳答案

由于您的目标是稀疏数据帧,因此我跳过了Series阶段并直接进入数据帧。我只有耐心在较小的数组大小上执行此操作:

nsamples = 10**3 
nfeatures = 10**2

创建rm是相同的,但我不加载到列表中,而是这样做:

df = pd.DataFrame(rm[1,:].toarray().ravel()).to_sparse(0)
for i in xrange(1,nsamples):
    df[i] = rm[i,:].toarray().ravel()

不幸的是,这比你的运行速度慢得多,但结果是一个数据帧,而不是一个列表。我对此进行了一些尝试,据我所知,没有任何快速方法可以逐列构建大型稀疏数据帧(甚至全是零),而不是一次全部构建(这不会是内存)高效的)。我能找到的文档中的所有示例都从密集结构开始,然后一步转换为稀疏结构。

无论如何,通过一次压缩一列,这种方式应该具有相当的内存效率,这样您就永远不会同时未压缩完整的数组/数据帧。生成的数据帧肯定是稀疏的:

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

并且绝对节省空间(几乎 25 倍压缩):

In [40]: df.memory_usage().sum()
Out[40]: 31528

In [41]: df.to_dense().memory_usage().sum()
Out[41]: 800000

关于python - pandas 对 SparseSeries 列表的内存使用情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30354869/

相关文章:

python - 防止多个约束sqlite3 python的重复

python - 使用 pandas 系列元素作为边界的简洁/优雅集成

python - 基于 bool 掩码选择行 - 为什么性能存在差异?

pandas - 创建由 Groupby 和转换生成的数据框列

python - 如何使用多索引 df 中的 2 行执行计算并将结果附加为新行?

Python循环url json数据不存储循环结果

python - 在 Python 中查找元组中的不匹配项并合并它们

python - 如何使用 pyYAML 将 python 元组添加到 YAML 文件?

python - 使用英特尔编译器和 MKL 构建 Numpy - CentOS 7

python - 描述时间序列 Pandas 中的差距