尽管密度极低,但使用稀疏 Pandas 数据帧没有 space 好处

No space benefit using sparse Pandas dataframe despite extremely low density

我正在使用 Python/Pandas 来处理非常大且非常稀疏的单列数据框,但是当我对它们进行 pickle 时,几乎没有任何好处。如果我在 Matlab 上尝试同样的事情,差异是巨大的,所以我试图了解发生了什么。

使用Pandas:

len(SecondBins)
>> 34300801

dense = pd.DataFrame(np.zeros(len(SecondBins)),columns=['Binary'],index=SecondBins)
sparse = pd.DataFrame(np.zeros(len(SecondBins)),columns=['Binary'],index=SecondBins).to_sparse(fill_value=0)

pickle.dump(dense,open('dense.p','wb'))
pickle.dump(sparse,open('sparse.p','wb'))

查看腌制文件的大小, 密集 = 548.8MB 稀疏 = 274.4MB

但是,当我查看与这些变量相关的内存使用情况时,

dense.memory_usage()
>>Binary    274406408
>>dtype: int64

sparse.memory_usage()
>>Binary    0
>>dtype: int64

因此,对于一个完全空的稀疏向量,节省了 50% 多一点。也许这与变量 'SecondBins' 由 pd.Timestamp 组成这一事实有关,我在 Pandas 中将其用作索引,因此我使用默认索引尝试了类似的过程。

dense_defaultindex = pd.DataFrame(np.zeros(len(SecondBins)),columns=['Binary'])
sparse_defaultindex = pd.DataFrame(np.zeros(len(SecondBins)),columns=['Binary']).to_sparse(fill_value=0)

pickle.dump(dense_defaultindex,open('dense_defaultindex.p','wb'))
pickle.dump(sparse_defaultindex,open('sparse_defaultindex.p','wb'))

但它在磁盘上产生相同的大小。

泡菜在幕后做什么? 如果我在 Matlab 中创建一个类似的零填充向量,并将其保存在 .mat 文件中,它是 ~180 字节!?

请指教

此致

请记住,pandas 是 标记的 数据。列标签和索引标签本质上是专门的数组,这些数组占用space。因此在实践中,就 space 用法而言,索引充当附加列,列标题充当附加行。

在密集的情况下,您基本上有两列,即数据和索引。在稀疏情况下,您基本上只有一列,即索引(因为备用数据列几乎不包含任何数据)。所以从这个角度来看,你会期望稀疏案例的大小大约是密集案例的一半。这就是您在文件大小中看到的。

然而,在 MATLAB 的情况下,数据没有被标记。因此,稀疏情况几乎不占space。与 MATLAB 情况等效的是稀疏矩阵,而不是备用数据帧结构。因此,如果您想充分利用 space 的节省,您应该使用 scipy.sparse,它提供类似于您在 MATLAB 中获得的稀疏矩阵支持。