簡體   English   中英

了解熊貓中的稀疏數據結構

[英]Understanding Sparse Data Structures in 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()似乎沒有改變它的大小?

正如我在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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM