为什么带有稀疏列的 Pandas 数据框会占用更多内存?

FCh*_*Chm 5 python dataframe pandas

我正在处理具有混合稀疏/密集列的数据集。由于稀疏列的数量大大超过了密集列的数量,我想看看是否可以使用Pandas 中的稀疏数据结构以有效的方式存储这些列。但是,在测试功能时,我发现具有稀疏列的数据框似乎占用更多内存,请考虑以下示例:

import numpy as np
import pandas as pd

a = np.zeros(10000000)
b = np.zeros(10000000)
a[3000:3100] = 2
b[300:310] = 1

df = pd.DataFrame({'a':pd.SparseArray(a), 'b':pd.SparseArray(b)})
print(df.info())
Run Code Online (Sandbox Code Playgroud)

这打印memory usage: 228.9 MB. 下一个:

df = pd.DataFrame({'a':a, 'b':b})
print(df.info())
Run Code Online (Sandbox Code Playgroud)

这打印memory usage: 152.6 MB.

非稀疏数据帧占用的空间更少吗?我误会了吗?

安装信息:

  • 熊猫 0.25.0
  • 蟒蛇 3.7.2

Ofe*_*dan 7

我已经复制了那些确切的数字。从文档

Pandas 提供了有效存储稀疏数据的数据结构。这些在典型的“大部分为 0”中不一定是稀疏的。相反,您可以将这些对象视为已“压缩”,其中任何匹配特定值(NaN/缺失值,但可以选择任何值,包括 0)的数据都将被省略。压缩值实际上并未存储在数组中。

这意味着您必须指定0应该压缩的元素。你可以通过使用来做到这一点fill_value=0,就像这样:

df = pd.DataFrame({'a':pd.SparseArray(a, fill_value=0), 'b':pd.SparseArray(b, fill_value=0)}) 
Run Code Online (Sandbox Code Playgroud)

df.info()在这种情况下,结果是 1.4kb 的内存使用量,非常显着的差异。

至于为什么它最初在您的示例中比普通的“未压缩”数组大,我的猜测是它与添加在所有仍然存在的普通数据之上的压缩数据有关(包括您的情况中的零)。无论如何,这只是一个猜测

文档中的附加阅读会告诉您,这0fill_value仅在 数组中的默认值data.dtype=int,而您的不是