了解熊猫中的稀疏数据结构

时间:2019-02-15 13:11:58

标签: python pandas

我必须处理大于本地计算机上RAM的数据帧。因此,我正在研究使用稀疏数据结构。

最初需要在创建虚拟变量时出现,从手册中我注意到pd.get_dummies()具有sparse = True选项,因此我在测试样本上使用了该选项并获得了预期的性能:

>>> test=pd.get_dummies(df, sparse=True)
>>> testSparsed = test.to_sparse()
>>> testDensed = test.to_dense()

>>> test.memory_usage().sum()
# expect no change as already sparse
>>> testSparsed.memory_usage().sum() 
# expect change on conversion to dense
>>> testDensed.memory_usage().sum()

89652
89652
25789582

但是,作为一项实验,我尝试在创建了虚拟对象后将“正常” df转换为稀疏df,这是我得到意外行为的地方:

>>> test2=pd.get_dummies(df, sparse=False)
>>> test2Sparsed = test2.to_sparse()
>>> test2Densed = test2.to_dense()

>>> test2.memory_usage().sum()
# expect change on sparse conversion
>>> test2Sparsed.memory_usage().sum() 
# expect same as test2
>>> test2Densed.memory_usage().sum() 

25789582
25789582
25789582

我期望test2Sparsed.memory_usage().sum()应该小于其他值,但不是。

我已经搜索了Stack Overflow,但没有找到任何相关的答案。

腌制这些对象并在命令行上查看文件大小时,我得到以下信息

> ls -sh test testSparsed testDensed test2 test2Sparsed test2Densed
2992 test    2992 testSparsed       50856 testDensed     50864 test2         
53344 test2Sparsed   50864 test2Densed       

检查test2数据帧的类型表明,test2Sparsed的内存应较小:

>>> type(test2)
>>> type(test2Sparsed)
>>> type(test2Densed)

pandas.core.frame.DataFrame
pandas.core.sparse.frame.SparseDataFrame
pandas.core.frame.DataFrame

所以我的问题是,为什么在密集数据帧上调用.to_sparse()似乎并没有改变它的大小?

1 个答案:

答案 0 :(得分:2)

pandas.DataFrame文档中可以看到。您必须使用fill_value指定要在表示形式中忽略的值。默认为fill_value = None

DataFrame.to_sparse(fill_value=None, kind='block')

使用test = pd.get_dummies(df, sparse=True)时,DataFrame test的值等于SparseArray。您可以看到fill_value的默认值取决于数据的类型。

data.dtype  na_value
float   np.nan
int 0
bool    False
datetime64  pd.NaT
timedelta64 pd.NaT