Pandas Advanced Tutorial: Разреженные структуры данных | Месяц темы Python

Python

Эта статья участвует в "Месяце тем Python", подробнее см.Ссылка на мероприятие

Введение

Если в данных много значений NaN, это будет тратить место в хранилище. Чтобы решить эту проблему, Pandas вводит структуру, называемую разреженными данными, для эффективного хранения этих значений NaN.

Примеры запасных данных

Мы создаем массив, устанавливаем большую часть его данных в NaN и используем этот массив для создания 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], что означает, что nan в массиве фактически не хранится, хранятся только не-nan данные, и тип этих данных — float64.

SparseArray

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

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:00')]

Свойства разреженного

sparse можно получить через .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

Расчет разреженного

Функция вычисления 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

SparseSeries и SparseDataFrame были удалены в версии 1.0.0. Их заменяет более мощный SparseArray.

Взгляните на разницу между использованием двух:

# 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, вы можете использовать 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

Эта статья была включена вwoohoo.floydpress.com/13-python-afraid…

Самая популярная интерпретация, самая глубокая галантерея, самые краткие уроки и множество трюков, о которых вы не знаете, ждут вас!