[英]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.