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 logging模块学习笔记
May 24 Python
python基础教程之缩进介绍
Aug 29 Python
python中文编码问题小结
Sep 28 Python
解决Scrapy安装错误:Microsoft Visual C++ 14.0 is required...
Oct 01 Python
django的csrf实现过程详解
Jul 26 Python
Python使用itchat模块实现群聊转发,自动回复功能示例
Aug 26 Python
python序列化与数据持久化实例详解
Dec 20 Python
Pytorch 计算误判率,计算准确率,计算召回率的例子
Jan 18 Python
Anaconda+VSCode配置tensorflow开发环境的教程详解
Mar 30 Python
Python导入父文件夹中模块并读取当前文件夹内的资源
Nov 19 Python
python爬虫利器之requests库的用法(超全面的爬取网页案例)
Dec 17 Python
python数据处理之Pandas类型转换
Apr 28 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循环检测目录是否存在并创建(循环创建目录)
2011/01/06 PHP
PHP中break及continue两个流程控制指令区别分析
2011/04/18 PHP
ThinkPHP3.2.2的插件控制器功能简述
2014/07/09 PHP
7个鲜为人知却非常实用的PHP函数
2015/07/01 PHP
基于php编程规范(详解)
2017/08/17 PHP
JQuery 常用方法基础教程
2009/02/06 Javascript
javascript form 验证函数 弹出对话框形式
2009/06/23 Javascript
Web前端设计模式  制作漂亮的弹出层
2010/10/29 Javascript
javascript 学习笔记(onchange等)
2010/11/14 Javascript
JavaScript取得鼠标绝对位置程序代码介绍
2012/09/16 Javascript
简单解析JavaScript中的__proto__属性
2016/05/10 Javascript
js 弹出对话框(遮罩)透明,可拖动的简单实例
2016/07/11 Javascript
JS实现复选框的全选和批量删除功能
2017/04/05 Javascript
详解Webpack DLL用法以及功能
2017/07/11 Javascript
简述jQuery Easyui一些用法
2017/08/01 jQuery
vue 指令之气泡提示效果的实现代码
2018/10/18 Javascript
如何用JavaScript实现功能齐全的单链表详解
2019/02/11 Javascript
layui前端时间戳转化实例
2019/11/15 Javascript
微信小程序实现录制、试听、上传音频功能(带波形图)
2020/02/27 Javascript
[04:31]2016国际邀请赛中国区预选赛妖精采访
2016/06/27 DOTA
[54:47]Liquid vs VP Supermajor决赛 BO 第五场 6.10
2018/07/05 DOTA
Python class的继承方法代码实例
2020/02/14 Python
解析HTML5中的新功能本地存储localStorage
2016/03/01 HTML / CSS
武汉瑞得软件笔试题
2015/10/27 面试题
大三在校生电子商务求职信
2013/10/29 职场文书
《恐龙》教学反思
2014/04/27 职场文书
安全生产年活动总结
2014/08/29 职场文书
工作失误检讨书(经典集锦版)
2014/10/17 职场文书
法人代表证明书范本
2015/06/18 职场文书
丧事主持词
2015/07/02 职场文书
七年级思品教学反思
2016/02/20 职场文书
2019年员工旷工保证书!
2019/06/28 职场文书
保安辞职申请书应该怎么写?
2019/07/15 职场文书
JavaScript文档对象模型DOM
2021/11/20 Javascript
Nginx性能优化之Gzip压缩设置详解(最大程度提高页面打开速度)
2022/02/12 Servers
python游戏开发之pygame实现接球小游戏
2022/04/22 Python