Pandas 稀疏資料結構的實現

2022-09-25 09:12:09 字數 3176 閱讀 1311

目錄

如果資料中有很多nan的值,儲存起來就會浪費空間。為了解決這個問題,pandas引入了一種叫做sparse data的結構,來有效的儲存這些nan的值。

我們建立乙個陣列,然後將其大部分資料設定為nan,接著使用這個陣列來建立sparsearray:

in [1]: arr = np.random.randn(10)

in [2]: arr[程式設計客棧2:-2] = np.nan

in [3]: ts = pd.series(pd.arrays.sp程式設計客棧arsearray(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],它的意思是陣列中的nan實際上並沒有儲存,只有非nan的資料才被儲存,並且這些資料的型別是float64.

arrays.sparsearray 是乙個  extensionarray  ,用來儲存稀疏的陣列型別。

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()  可以將其轉換為普通的陣列:

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 表示的是spare型別。它包含兩種資訊,第一種是非nan值的資料型別,第二種是填充時候的常量值,比如nan:

in [19]: sparr.dtype

out[19]: sparse[float64, nan]

可以像下面這樣構造乙個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:qnquzuuzoc00')]

可以通過 .sparse 來訪問sparse:

in [23]: s = pd.series([0, 0, 1, 2], dtype="sparse[int]")

in [24]: s.sparse.density

qnquzuuzocout[24]: 0.5

in [25]: s.sparse.fill_value

out[25]: 0

np的計算函式可以直接用在sparsearray中,並且會返回乙個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在1.0.0 的版本時候被刪除了。取代他們的是功能更強的sparsearray。

看下兩者的使用上的區別:

# previous way

>>> pd.sparsedataframe()

# new way

in [31]: pd.dataframe()

out[31]:

a0 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

Pandas 稀疏資料

當任何匹配特定值的資料 nan 缺失值,儘管可以選擇任何值 被省略時,稀疏物件被 壓縮 乙個特殊的sparseindex物件跟蹤資料被 稀疏 的地方。這將在乙個例子中更有意義。所有的標準pandas資料結構都應用了to sparse方法 import pandas as pd import nump...

資料結構 稀疏矩陣的實現方法

什麼是稀疏矩陣,怎麼定義才是稀疏矩陣?假設在m x n的矩陣中,有t個不為0的元素。令z t m x n 若z 0.05則稱此矩陣為稀疏矩陣。由於稀疏矩陣的非0元素較少,所以如果用大容量儲存必定會造成記憶體浪費,因此只需儲存非0元素值即可,以下列出了常用的三種儲存稀疏矩陣的方法。三元組順序表的實現用...

pandas資料結構

coding utf 8 pandas是numpy的公升級版,功能比numpy更高階 import pandas as pd import numpy as np pandas庫主要定義了兩種資料型別 series dataframe 通過乙個list列表構建乙個series資料 ser obj p...