Pandas 稀疏数据结构的实现


Posted in Python onJuly 25, 2021

简介

如果数据中有很多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

到此这篇关于Pandas 稀疏数据结构的实现的文章就介绍到这了,更多相关Pandas 稀疏数据结构内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python实现爬虫下载漫画示例
Feb 16 Python
python字典多条件排序方法实例
Jun 30 Python
python数据结构之图的实现方法
Jul 08 Python
Python随机数random模块使用指南
Sep 09 Python
Python实现购物车程序
Apr 16 Python
python3使用SMTP发送HTML格式邮件
Jun 19 Python
Pytorch基本变量类型FloatTensor与Variable用法
Jan 08 Python
tensorflow如何继续训练之前保存的模型实例
Jan 21 Python
Python如何发送与接收大型数组
Aug 07 Python
python3处理word文档实例分析
Dec 01 Python
python编程项目中线上问题排查与解决
Nov 01 Python
opencv深入浅出了解机器学习和深度学习
Mar 17 Python
Python中rapidjson参数校验实现
Jul 25 #Python
理解python中装饰器的作用
Jul 21 #Python
opencv检测动态物体的实现
Python爬虫中urllib3与urllib的区别是什么
python Django框架快速入门教程(后台管理)
Python编写nmap扫描工具
Jul 21 #Python
Django模型层实现多表关系创建和多表操作
Jul 21 #Python
You might like
PHP自定义错误用法示例
2016/09/28 PHP
php封装的表单验证类完整实例
2016/10/19 PHP
Bootstrap+PHP实现多图上传功能实例详解
2018/04/08 PHP
php 获取xml接口数据的处理方法
2018/05/31 PHP
零基础php编程好学吗
2019/10/11 PHP
jQueryUI的Dialog的简单封装
2010/06/07 Javascript
js异常捕获方法介绍
2013/04/10 Javascript
Extjs实现进度条的两种便捷方式
2013/09/26 Javascript
extjs4 treepanel动态改变行高度示例
2013/12/17 Javascript
js中日期的加减法
2015/05/06 Javascript
JavaScript 实现的 zip 压缩和解压缩工具包Zip.js使用详解
2015/12/14 Javascript
浅谈js数据类型判断与数组判断
2016/08/29 Javascript
浅谈ES6新增的数组方法和对象
2017/08/08 Javascript
详解Vue路由自动注入实践
2019/04/17 Javascript
jQuery 筛选器简单操作示例
2019/10/02 jQuery
vue 使用post/get 下载导出文件操作
2020/08/07 Javascript
使用pyecharts在jupyter notebook上绘图
2020/04/23 Python
Python基于递归算法实现的走迷宫问题
2017/08/04 Python
python 实现在txt指定行追加文本的方法
2018/04/29 Python
详解numpy.meshgrid()方法使用
2019/08/01 Python
基于Python解密仿射密码
2019/10/21 Python
python tkinter 设置窗口大小不可缩放实例
2020/03/04 Python
css3和jquery实现自定义checkbox和radiobox组件
2014/04/22 HTML / CSS
Lookfantastic瑞典:英国知名美妆购物网站
2018/04/06 全球购物
美国LOGO设计公司:The Logo Company
2018/07/16 全球购物
Europcar意大利:汽车租赁
2019/07/07 全球购物
亚洲航空公司官方网站:AirAsia
2019/11/25 全球购物
linux下进程间通信的方式
2014/12/23 面试题
大学优秀班集体申报材料
2014/05/23 职场文书
不服从上级领导安排的检讨书
2014/09/14 职场文书
2015年社会治安综合治理工作总结
2015/04/10 职场文书
大学生十八大感想
2015/08/11 职场文书
团结主题班会
2015/08/13 职场文书
会计主管竞聘书
2015/09/15 职场文书
pandas进行数据输入和输出的方法详解
2022/03/23 Python
html原生table实现合并单元格以及合并表头的示例代码
2023/05/07 HTML / CSS