它将根据 memory_usage() 按列显示内存使用情况来节省内存,或者您可以通过 info() 查看整个数据帧的总内存使用情况。
df = pd.DataFrame({ 'x':[0, 0, 1, 0, 0, 3, 0, 0, 0, 5, 0] })
sdf = df.to_sparse(fill_value=0)
df.memory_usage()
x 88
dtype: int64
sdf.memory_usage()
x 24
dtype: int64
有点意思,数据的底层形状似乎隐藏在数据帧级别:
df.shape
(11, 1)
sdf.shape
(11, 1)
但暴露在列级:
df['x'].shape
(11,)
sdf['x'].shape
(3,)
我想不出将标准列和稀疏列组合在同一个数据框中的方法,但我当然不是这方面的专家,所以我不知道这是否可能。但据我所知,稀疏数据帧只是“类似ndarray”对象的包装器,所以我认为你需要坚持使用本质上是同质numpy数组的数据帧。
我最近没有玩过它,但我认为 bcolz 在这里更灵活(在混合 dtypes 方面),但显然不能为您提供所有 pandas 数据框的便利。
但是,只要您将列分开,您似乎确实可以以标准的 pandasic 方式做很多事情,尽管不是全部:
df = pd.DataFrame({ 'x':[0, 0, 1, 0, 0, 3, 0, 0, 0, 5, 0],
'y':[0, 2, 0, 0, 0, 3, 0, 1, 0, 0, 0] })
sdf = df.to_sparse(fill_value=0)
df + sdf # works
df['x'] + sdf['x'] # works
df['x'] + sdf['y'] # doesn't work, b/c shapes different?
但你可以这样做:
df['x'] + sdf['y'].to_dense()
不太方便,但也不算太差,而且总体上仍可能节省内存,因为您必须暂时扩展一列 sdf,而不是整个 sdf 数据帧。