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 08 Python
Python实现一个服务器监听多个客户端请求
Apr 12 Python
python发送邮件脚本
May 22 Python
Flask框架实现的前端RSA加密与后端Python解密功能详解
Aug 13 Python
Django 自定义分页器的实现代码
Nov 24 Python
pytorch中tensor张量数据类型的转化方式
Dec 31 Python
python实现简单学生信息管理系统
Apr 09 Python
Pycharm无法打开双击没反应的问题及解决方案
Aug 17 Python
python实现简单贪吃蛇游戏
Sep 29 Python
查找适用于matplotlib的中文字体名称与实际文件名对应关系的方法
Jan 05 Python
用python制作个视频下载器
Feb 01 Python
Pandas数据结构之Series的使用
Mar 31 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
Terran魔法科技
2020/03/14 星际争霸
也谈 PHP 和 MYSQL
2006/10/09 PHP
php include,include_once,require,require_once
2008/09/05 PHP
PHP循环语句笔记(foreach,list)
2011/11/29 PHP
解决phpcms更换javascript的幻灯片代码调用图片问题
2014/12/26 PHP
浅谈PHP的反射机制
2016/12/15 PHP
Laravel 微信小程序后端实现用户登录的示例代码
2019/11/26 PHP
如何重写Laravel异常处理类详解
2020/12/20 PHP
LBS blog sql注射漏洞[All version]-官方已有补丁
2007/08/26 Javascript
通过 Dom 方法提高 innerHTML 性能
2008/03/26 Javascript
JavaScript 权威指南(第四版) 读书笔记
2009/08/11 Javascript
JavaScript的类型简单说明
2010/09/03 Javascript
使用Chrome调试JavaScript的断点设置和调试技巧
2014/12/16 Javascript
JavaScript实现身份证验证代码
2016/02/17 Javascript
原生JS实现图片轮播与淡入效果的简单实例
2016/08/21 Javascript
js使用Replace结合正则替换重复出现的字符串功能示例
2016/12/27 Javascript
Web前端框架bootstrap实战【第一次接触使用】
2016/12/28 Javascript
jQuery中Chosen三级联动功能实例代码
2017/03/07 Javascript
bootstrap精简教程_动力节点Java学院整理
2017/07/14 Javascript
JavaScript模拟文件拖选框样式v1.0的实例
2017/08/04 Javascript
史上最全JavaScript数组去重的十种方法(推荐)
2017/08/17 Javascript
vue.js获得当前元素的文字信息方法
2018/03/09 Javascript
vue路由分文件拆分管理详解
2020/08/13 Javascript
如何在VUE中使用vue-awesome-swiper
2021/01/04 Vue.js
判断网页编码的方法python版
2016/08/12 Python
python中WSGI是什么,Python应用WSGI详解
2017/11/24 Python
Python性能分析工具Profile使用实例
2019/11/19 Python
Python常用扩展插件使用教程解析
2020/11/02 Python
python re.match()用法相关示例
2021/01/27 Python
recorder.js 基于Html5录音功能的实现
2020/05/26 HTML / CSS
LODI女鞋在线商店:阿利坎特的鞋类品牌
2019/02/15 全球购物
英国健康和美容技术产品购物网站:CurrentBody
2019/07/17 全球购物
大学生军训自我评价分享
2013/11/09 职场文书
军训自我鉴定范文
2014/02/13 职场文书
行政专员求职信范文
2014/05/03 职场文书
环境科学专业求职信
2014/08/04 职场文书