Pandas 稀疏数据结构的实现

作者:程序那些事 时间:2022-01-29 15:08:32 

目录
  • 简介

  • Spare data的例子

  • SparseArray

  • SparseDtype

  • Sparse的属性

  • Sparse的计算

  • SparseSeries 和 SparseDataFrame

简介

如果数据中有很多NaN的值,存储起来就会浪费空间。为了解决这个问题,Pandas引入了一种叫做Sparse data的结构,来有效的存储这些NaN的值。

Spare 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()  可以将其转换为普通的数组:


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 来访问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的计算

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 中的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

来源:https://juejin.cn/post/6986815116905807879

标签:Pandas,稀疏数据结构
0
投稿

猜你喜欢

  • Python中eval()函数的详细使用教程

    2023-11-22 15:51:39
  • python开发简易版在线音乐播放器

    2022-08-29 14:38:29
  • 解决django同步数据库的时候app models表没有成功创建的问题

    2024-01-15 02:04:09
  • Python中的异常处理讲解

    2023-01-29 11:22:57
  • 基于pycharm 项目和项目文件命名规则的介绍

    2021-02-05 19:30:51
  • Pandas DataFrame操作数据增删查改

    2022-07-10 09:37:39
  • python交互式图形编程实例(三)

    2021-10-10 17:34:39
  • Python中typing模块与类型注解的使用方法

    2022-10-30 14:09:42
  • python光学仿真学习wxpython创建手速测试程序

    2023-12-06 20:57:28
  • PyTorch中常用的激活函数的方法示例

    2022-11-02 01:17:44
  • 在pandas中遍历DataFrame行的实现方法

    2022-02-16 13:13:26
  • golang 中 channel 的详细使用、使用注意事项及死锁问题解析

    2024-04-26 17:26:45
  • python中while循环语句用法简单实例

    2021-12-03 22:34:44
  • python的函数最详解

    2022-02-15 17:05:05
  • python进程管理工具supervisor使用实例

    2022-08-24 13:47:03
  • Python 调用 C++ 传递numpy 数据详情

    2021-05-12 20:00:39
  • Python脚本导出为exe程序的方法

    2022-08-22 21:33:05
  • 微信小程序开发之数据存储 参数传递 数据缓存

    2024-04-19 09:49:44
  • python3 下载网络图片代码实例

    2021-11-21 01:11:40
  • Ubuntu权限不足无法创建文件夹解决方案

    2021-04-06 01:31:27
  • asp之家 网络编程 m.aspxhome.com