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实现微信公众平台自定义菜单实例
Mar 20 Python
简单学习Python time模块
Apr 29 Python
Django自定义manage命令实例代码
Feb 11 Python
Numpy array数据的增、删、改、查实例
Jun 04 Python
Python登录注册验证功能实现
Jun 18 Python
Python实现的连接mssql数据库操作示例
Aug 17 Python
基于python 凸包问题的解决
Apr 16 Python
Python如何向SQLServer存储二进制图片
Jun 08 Python
Python3 webservice接口测试代码详解
Jun 23 Python
Python threading模块condition原理及运行流程详解
Oct 05 Python
Python reversed反转序列并生成可迭代对象
Oct 22 Python
Keras在mnist上的CNN实践,并且自定义loss函数曲线图操作
May 25 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
水质对咖图啡风味的影响具体有哪些
2021/03/03 冲泡冲煮
php实现天干地支计算器示例
2014/03/14 PHP
php实现的单一入口应用程序实例分析
2015/09/23 PHP
微信公众号模板消息群发php代码示例
2016/12/29 PHP
laravel框架关于搜索功能的实现
2018/03/15 PHP
图片按比例缩放函数
2006/06/26 Javascript
javascript实现动态增加删除表格行(兼容IE/FF)
2007/04/02 Javascript
javascript 函数速查表
2010/02/07 Javascript
jQuery下通过replace字符串替换实现大小图片切换
2012/05/22 Javascript
仿谷歌主页js动画效果实现代码
2013/07/14 Javascript
JavaScript的常见兼容问题及相关解决方法(chrome/IE/firefox)
2013/12/31 Javascript
JS中使用Array函数shift和pop创建可忽略参数的例子
2014/05/28 Javascript
jQuery插件 Jqplot图表实例
2016/06/18 Javascript
关于js原型的面试题讲解
2016/09/25 Javascript
解决前端跨域问题方案汇总
2016/11/20 Javascript
hovertree插件实现二级树形菜单(简单实用)
2016/12/28 Javascript
详谈构造函数加括号与不加括号的区别
2017/10/26 Javascript
vue实现提示保存后退出的方法
2018/03/15 Javascript
详解Bootstrap 学习(一)入门
2019/04/12 Javascript
node.js使用zlib模块进行数据压缩和解压操作示例
2020/02/12 Javascript
使用Node.js实现base64和png文件相互转换的方法
2020/03/11 Javascript
[01:14]英雄,所敬略同——2018完美盛典宣传视频
2018/12/05 DOTA
Python定时任务sched模块用法示例
2018/07/16 Python
在python中利用GDAL对tif文件进行读写的方法
2018/11/29 Python
python 两个数据库postgresql对比
2019/10/21 Python
Python的赋值、深拷贝与浅拷贝的区别详解
2020/02/12 Python
如何在Windows中安装多个python解释器
2020/06/16 Python
Python用requests库爬取返回为空的解决办法
2021/02/21 Python
澳大利亚UGG工厂直销:Australian Ugg Boots
2017/10/14 全球购物
Stuarts London美国/加拿大:世界领先的独立男装零售商之一
2019/03/18 全球购物
造价工程师个人求职信
2013/09/21 职场文书
美容院考勤制度
2014/01/30 职场文书
道路施工安全责任书
2014/07/24 职场文书
创建绿色社区汇报材料
2014/08/22 职场文书
2014年计生协会工作总结
2014/11/21 职场文书
党员干部学法用法心得体会
2016/01/21 职场文书