Pandas 稀疏数据结构详解:SparseArray 与 SparseDtype 实现

Alice
Alice
发布时间:2026-10-14| 4人浏览过
原创

本文介绍Pandas中用于高效存储含大量NaN值数据的稀疏数据结构。重点讲解SparseArray的创建、SparseDtype的类型定义(如非NaN值类型与填充常量),以及通过.sparse属性访问密度和填充值的方法。同时说明SparseSeries和SparseDataFrame在1.0.0版本后的替代方案,并提供SciPy稀疏矩阵转换示例。

简介

当数据集中存在大量NaN(缺失值)时,常规存储方式会浪费大量内存空间。为此,Pandas引入了稀疏数据结构(Sparse data),旨在优化这类数据的存储效率,仅保留非缺失值信息。

Sparse data的例子

首先创建一个包含随机数的数组,将中间部分数据设置为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() 函数,可以将SparseArray转换回普通的NumPy数组:


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 用于定义稀疏数据的类型属性,包含两个关键信息:一是非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

Sparse的计算

NumPy的计算函数可以直接应用于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

在Pandas 1.0.0版本中,SparseSeries和SparseDataFrame已被移除,取而代之的是功能更强大的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

以上就是关于Pandas稀疏数据结构实现的详细介绍,更多相关内容可参考本站过往文章或继续浏览后续章节,感谢支持!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。