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文本生成二维码实例
Jan 06 Python
安装Python和pygame及相应的环境变量配置(图文教程)
Jun 04 Python
Python对字符串实现去重操作的方法示例
Aug 11 Python
Python基于辗转相除法求解最大公约数的方法示例
Apr 04 Python
Pytorch反向求导更新网络参数的方法
Aug 17 Python
OpenCV模板匹配matchTemplate的实现
Oct 18 Python
python3 assert 断言的使用详解 (区别于python2)
Nov 27 Python
用python求一重积分和二重积分的例子
Dec 06 Python
Python函数参数分类原理详解
May 28 Python
python代码实现猜拳小游戏
Nov 30 Python
Python实现一个论文下载器的过程
Jan 18 Python
用 Python 定义 Schema 并生成 Parquet 文件详情
Sep 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
十天学会php之第二天
2006/10/09 PHP
PHP date函数参数详解
2006/11/27 PHP
PHP提高编程效率的20个要点
2015/09/23 PHP
PHP 闭包详解及实例代码
2016/09/28 PHP
php 使用html5 XHR2实现上传文件与进度显示功能示例
2020/03/03 PHP
jQuery UI-Draggable 参数集合
2010/01/10 Javascript
JavaScript中的16进制字符(改进)
2011/11/21 Javascript
JQuery写动态树示例代码
2013/07/31 Javascript
extjs中form与grid交互数据(record)的方法
2013/08/29 Javascript
Javascript 多浏览器兼容总结(实战经验)
2013/10/30 Javascript
nodejs中操作mysql数据库示例
2014/12/20 NodeJs
浅谈JavaScript正则表达式分组匹配
2015/04/10 Javascript
jQuery实现页面顶部显示的进度条效果完整实例
2015/12/09 Javascript
几句话带你理解JS中的this、闭包、原型链
2016/09/26 Javascript
详解Node.js中的Async和Await函数
2018/02/22 Javascript
解决vue-cli + webpack 新建项目出错的问题
2018/03/20 Javascript
基于Webpack4和React hooks搭建项目的方法
2019/02/05 Javascript
NodeJs入门教程之定时器和队列
2019/03/08 NodeJs
JS实现马赛克图片效果完整示例
2019/04/13 Javascript
Vue.js 实现地址管理页面思路详解(地址添加、编辑、删除和设置默认地址)
2019/12/11 Javascript
JS如何把字符串转换成json
2020/02/21 Javascript
[01:32]TI奖金增速竟因它再创新高!DOTA2勇士令状不朽珍藏Ⅰ饰品欣赏
2018/05/18 DOTA
[00:17]天涯墨客一技能展示
2018/08/25 DOTA
python里大整数相乘相关技巧指南
2014/09/12 Python
python实现百度语音识别api
2018/04/10 Python
Python处理CSV与List的转换方法
2018/04/19 Python
Python爬虫之正则表达式的使用教程详解
2018/10/25 Python
python读取word文档,插入mysql数据库的示例代码
2018/11/07 Python
基于python爬取链家二手房信息代码示例
2020/10/21 Python
意大利比基尼品牌:MISS BIKINI
2019/11/02 全球购物
大学活动策划书范文
2014/01/10 职场文书
上学迟到的检讨书
2014/01/11 职场文书
大学生职业生涯规划范文——找准自我,定位人生
2014/01/23 职场文书
个人债务授权委托书范本
2014/10/05 职场文书
2014年信贷员工作总结
2014/11/18 职场文书
mysql sql常用语句大全
2022/06/21 MySQL