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使用PIL库实现验证码图片的方法
Mar 11 Python
Python实现爬取需要登录的网站完整示例
Aug 19 Python
Django项目开发中cookies和session的常用操作分析
Jul 03 Python
Python中浅拷贝copy与深拷贝deepcopy的简单理解
Oct 26 Python
python输出电脑上所有的串口名的方法
Jul 02 Python
python的几种矩阵相乘的公式详解
Jul 10 Python
python并发编程多进程 互斥锁原理解析
Aug 20 Python
Python any()函数的使用方法
Oct 28 Python
Anaconda3+tensorflow2.0.0+PyCharm安装与环境搭建(图文)
Feb 18 Python
Python趣味入门教程之循环语句while
Aug 26 Python
python实现在列表中查找某个元素的下标示例
Nov 16 Python
详细介绍python类及类的用法
May 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
文件上传的实现
2006/10/09 PHP
优化使用mysql存储session的php代码
2008/01/10 PHP
免费的ip数据库淘宝IP地址库简介和PHP调用实例
2014/04/08 PHP
PHP 实现字符串翻转(包含中文汉字)的实现代码
2017/04/01 PHP
30个最好的jQuery 灯箱插件分享
2011/04/25 Javascript
jQuery教程 $()包装函数来实现数组元素分页效果
2013/08/13 Javascript
javascript date格式化示例
2013/09/25 Javascript
javascript实现检验的各种规则
2015/07/31 Javascript
jquery UI Datepicker时间控件的使用方法(终结版)
2015/11/07 Javascript
js实现简单排列组合的方法
2016/01/27 Javascript
js基于cookie方式记住返回页面用法示例
2016/05/27 Javascript
JS获取一个未知DIV高度的方法
2016/08/09 Javascript
分分钟玩转Vue.js组件
2016/10/25 Javascript
详解Angular4中路由Router类的跳转navigate
2017/06/09 Javascript
JavaScript中使用Async实现异步控制
2017/08/15 Javascript
CSS3 动画卡顿性能优化的完美解决方案
2018/09/20 Javascript
vue.js 2.*项目环境搭建、运行、打包发布的详细步骤
2019/05/01 Javascript
八种Vue组件间通讯方式合集(推荐)
2020/08/18 Javascript
javascript使用canvas实现饼状图效果
2020/09/08 Javascript
Python中的anydbm模版和shelve模版使用指南
2015/07/09 Python
Python中typing模块与类型注解的使用方法
2019/08/05 Python
Django实现文件上传下载功能
2019/10/06 Python
python opencv根据颜色进行目标检测的方法示例
2020/01/15 Python
解决使用python print打印函数返回值多一个None的问题
2020/04/09 Python
CSS3实现跳动的动画效果
2016/09/12 HTML / CSS
HTML5 对各个标签的定义与规定:body的介绍
2012/06/21 HTML / CSS
HTML5中Canvas与SVG的画图原理比较
2013/01/16 HTML / CSS
兰蔻俄罗斯官方网站:Lancome俄罗斯
2019/12/09 全球购物
大学生怎样进行自我评价
2013/12/07 职场文书
会计专业的自荐信
2013/12/12 职场文书
优秀工会工作者事迹材料
2014/06/02 职场文书
员工生日活动方案
2014/08/24 职场文书
简单通用的简历自我评价
2014/09/21 职场文书
大学生实训报告总结
2014/11/05 职场文书
建议书范文
2015/02/05 职场文书
女性健康知识讲座通知
2015/04/23 职场文书