Pandas 稀疏數(shù)據(jù)結(jié)構(gòu)的實(shí)現(xiàn)
簡(jiǎn)介
如果數(shù)據(jù)中有很多NaN的值,存儲(chǔ)起來(lái)就會(huì)浪費(fèi)空間。為了解決這個(gè)問(wèn)題,Pandas引入了一種叫做Sparse data的結(jié)構(gòu),來(lái)有效的存儲(chǔ)這些NaN的值。
Spare data的例子
我們創(chuàng)建一個(gè)數(shù)組,然后將其大部分?jǐn)?shù)據(jù)設(shè)置為NaN,接著使用這個(gè)數(shù)組來(lái)創(chuàng)建SparseArray:
In [1]: arr = np.random.randn(10) In [2]: arr[2:-2] = np.nan In [3]: ts = pd.Series(pd.arrays.SparseArray(arr)) In [4]: ts Out[4]: 0 0.469112 1 -0.282863 2 NaN 3 NaN 4 NaN 5 NaN 6 NaN 7 NaN 8 -0.861849 9 -2.104569 dtype: Sparse[float64, nan]
這里的dtype類型是Sparse[float64, nan],它的意思是數(shù)組中的nan實(shí)際上并沒(méi)有存儲(chǔ),只有非nan的數(shù)據(jù)才被存儲(chǔ),并且這些數(shù)據(jù)的類型是float64.
SparseArray
arrays.SparseArray 是一個(gè) ExtensionArray ,用來(lái)存儲(chǔ)稀疏的數(shù)組類型。
In [13]: arr = np.random.randn(10) In [14]: arr[2:5] = np.nan In [15]: arr[7:8] = np.nan In [16]: sparr = pd.arrays.SparseArray(arr) In [17]: sparr Out[17]: [-1.9556635297215477, -1.6588664275960427, nan, nan, nan, 1.1589328886422277, 0.14529711373305043, nan, 0.6060271905134522, 1.3342113401317768] Fill: nan IntIndex Indices: array([0, 1, 5, 6, 8, 9], dtype=int32)
使用 numpy.asarray() 可以將其轉(zhuǎn)換為普通的數(shù)組:
In [18]: np.asarray(sparr) Out[18]: array([-1.9557, -1.6589, nan, nan, nan, 1.1589, 0.1453, nan, 0.606 , 1.3342])
SparseDtype
SparseDtype 表示的是Spare類型。它包含兩種信息,第一種是非NaN值的數(shù)據(jù)類型,第二種是填充時(shí)候的常量值,比如nan:
In [19]: sparr.dtype Out[19]: Sparse[float64, nan]
可以像下面這樣構(gòu)造一個(gè)SparseDtype:
In [20]: pd.SparseDtype(np.dtype('datetime64[ns]')) Out[20]: Sparse[datetime64[ns], NaT]
可以指定填充的值:
In [21]: pd.SparseDtype(np.dtype('datetime64[ns]'), ....: fill_value=pd.Timestamp('2017-01-01')) ....: Out[21]: Sparse[datetime64[ns], Timestamp('2017-01-01 00:00:00')]
Sparse的屬性
可以通過(guò) .sparse 來(lái)訪問(wèn)sparse:
In [23]: s = pd.Series([0, 0, 1, 2], dtype="Sparse[int]") In [24]: s.sparse.density Out[24]: 0.5 In [25]: s.sparse.fill_value Out[25]: 0
Sparse的計(jì)算
np的計(jì)算函數(shù)可以直接用在SparseArray中,并且會(huì)返回一個(gè)SparseArray。
In [26]: arr = pd.arrays.SparseArray([1., np.nan, np.nan, -2., np.nan]) In [27]: np.abs(arr) Out[27]: [1.0, nan, nan, 2.0, nan] Fill: nan IntIndex Indices: array([0, 3], dtype=int32)
SparseSeries 和 SparseDataFrame
SparseSeries 和 SparseDataFrame在1.0.0 的版本時(shí)候被刪除了。取代他們的是功能更強(qiáng)的SparseArray。
看下兩者的使用上的區(qū)別:
# Previous way >>> pd.SparseDataFrame({"A": [0, 1]})
# New way In [31]: pd.DataFrame({"A": pd.arrays.SparseArray([0, 1])}) Out[31]: A 0 0 1 1
如果是SciPy 中的sparse 矩陣,那么可以使用 DataFrame.sparse.from_spmatrix() :
# Previous way >>> from scipy import sparse >>> mat = sparse.eye(3) >>> df = pd.SparseDataFrame(mat, columns=['A', 'B', 'C'])
# New way In [32]: from scipy import sparse In [33]: mat = sparse.eye(3) In [34]: df = pd.DataFrame.sparse.from_spmatrix(mat, columns=['A', 'B', 'C']) In [35]: df.dtypes Out[35]: A Sparse[float64, 0] B Sparse[float64, 0] C Sparse[float64, 0] dtype: object
到此這篇關(guān)于Pandas 稀疏數(shù)據(jù)結(jié)構(gòu)的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Pandas 稀疏數(shù)據(jù)結(jié)構(gòu)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python數(shù)據(jù)結(jié)構(gòu)之順序表的實(shí)現(xiàn)代碼示例
這篇文章主要介紹了Python數(shù)據(jù)結(jié)構(gòu)之順序表的實(shí)現(xiàn)代碼示例,簡(jiǎn)單介紹了順序表的相關(guān)內(nèi)容,然后分享了其代碼示例,具有一定參考價(jià)值,需要的朋友可以了解下。2017-11-11python+OpenCV人臉識(shí)別考勤系統(tǒng)實(shí)現(xiàn)的詳細(xì)代碼
作為一個(gè)基于人臉識(shí)別算法的考勤系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)教程,以下內(nèi)容將提供詳細(xì)的步驟和代碼示例。本教程將使用 Python 語(yǔ)言和 OpenCV 庫(kù)進(jìn)行實(shí)現(xiàn),需要的朋友可以參考下2023-05-05MATLAB中text函數(shù)使用的語(yǔ)法與示例代碼
text函數(shù)的功能是向數(shù)據(jù)點(diǎn)添加文本說(shuō)明,下面這篇文章主要給大家介紹了關(guān)于MATLAB中text函數(shù)使用的語(yǔ)法與示例的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-05-05numpy.transpose()實(shí)現(xiàn)數(shù)組的轉(zhuǎn)置例子
今天小編就為大家分享一篇numpy.transpose()實(shí)現(xiàn)數(shù)組的轉(zhuǎn)置例子,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-12-12Python3爬蟲(chóng)中識(shí)別圖形驗(yàn)證碼的實(shí)例講解
在本篇內(nèi)容里小編給大家分享的是關(guān)于Python3爬蟲(chóng)中識(shí)別圖形驗(yàn)證碼的實(shí)例講解內(nèi)容,需要的朋友們可以學(xué)習(xí)參考下。2020-07-07Python3 導(dǎo)入上級(jí)目錄中的模塊實(shí)例
今天小編就為大家分享一篇Python3 導(dǎo)入上級(jí)目錄中的模塊實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-02-02Python使用zmail進(jìn)行郵件發(fā)送的示例詳解
這篇文章主要為大家詳細(xì)介紹了Python如何使用zmail進(jìn)行郵件發(fā)送功能,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,有需要的小伙伴可以參考一下2024-03-03