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的装饰器模式与面向切面编程详解
Jun 21 Python
Python中运算符"=="和"is"的详解
Oct 08 Python
Python使用plotly绘制数据图表的方法
Jul 18 Python
使用TensorFlow实现SVM
Sep 06 Python
使用 Supervisor 监控 Python3 进程方式
Dec 05 Python
python 字典访问的三种方法小结
Dec 05 Python
执行Python程序时模块报错问题
Mar 26 Python
keras实现多种分类网络的方式
Jun 11 Python
改变 Python 中线程执行顺序的方法
Sep 24 Python
如何在vscode中安装python库的方法步骤
Jan 06 Python
Python Django搭建文件下载服务器的实现
May 10 Python
解决Python字典查找报Keyerror的问题
May 26 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连接oracle数据库的方法(测试成功)
2016/05/26 PHP
php实现的pdo公共类定义与用法示例
2017/07/19 PHP
PHP连接SQL Server的方法分析【基于thinkPHP5.1框架】
2019/05/06 PHP
PHP手机号码及邮箱正则表达式实例解析
2020/07/11 PHP
javascript CSS画图之基础篇
2009/07/29 Javascript
基于jquery的finkyUI插件与Ajax实现页面数据加载功能
2010/12/03 Javascript
读jQuery之四(优雅的迭代)
2011/06/20 Javascript
推荐40个非常优秀的jQuery插件和教程【系列三】
2011/11/09 Javascript
JavaScript版DateAdd和DateDiff函数代码
2012/03/01 Javascript
javascript实现简单的页面右下角提示信息框
2015/07/31 Javascript
js如何判断输入字符串长度
2015/12/16 Javascript
jQuery绑定事件on()与弹窗的简要概述
2016/04/27 Javascript
JS实用技巧小结(屏蔽错误、div滚动条设置、背景图片位置等)
2016/06/16 Javascript
简单谈谈Vue 模板各类数据绑定
2016/09/25 Javascript
get  post jsonp三种数据交互形式实例详解
2017/08/25 Javascript
详解动画插件wow.js的使用方法
2017/09/13 Javascript
javascript 作用于作用域链的详解
2017/09/27 Javascript
Angular8 Http拦截器简单使用教程
2019/08/20 Javascript
JS实现可用滑块滑动的缓动图代码
2019/09/01 Javascript
JavaScript实现HSL拾色器
2020/05/21 Javascript
Vue3新特性之在Composition API中使用CSS Modules
2020/07/13 Javascript
[56:14]Fnatic vs OG 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
Python入门篇之字典
2014/10/17 Python
python框架flask入门之路由及简单实现方法
2020/06/07 Python
Python读取Excel数据并生成图表过程解析
2020/06/18 Python
关于PySnooper 永远不要使用print进行调试的问题
2021/03/04 Python
澳大利亚波希米亚风时尚品牌:Tree of Life
2019/09/15 全球购物
德国拖鞋网站:German Slippers
2019/11/08 全球购物
SheIn沙特阿拉伯:女装在线
2020/03/23 全球购物
什么是三层交换,说说和路由的区别在那里
2014/09/01 面试题
Linux机考试题
2015/07/17 面试题
Servlet方面面试题
2016/09/28 面试题
大学生实习思想汇报
2014/01/12 职场文书
勤俭节约演讲稿
2014/05/08 职场文书
工会工作先进事迹
2014/08/18 职场文书
小学班级标语口号大全
2015/12/26 职场文书