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采集猫眼两万条数据 对《无名之辈》影评进行分析
Dec 05 Python
使用python批量化音乐文件格式转换的实例
Jan 09 Python
对PyQt5中树结构的实现方法详解
Jun 17 Python
django框架实现模板中获取request 的各种信息示例
Jul 01 Python
简单了解python中的f.b.u.r函数
Nov 02 Python
在django-xadmin中APScheduler的启动初始化实例
Nov 15 Python
tensorflow之并行读入数据详解
Feb 05 Python
PyCharm无法识别PyQt5的2种解决方法,ModuleNotFoundError: No module named 'pyqt5'
Feb 17 Python
基于python实现matlab filter函数过程详解
Jun 08 Python
详解selenium + chromedriver 被反爬的解决方法
Oct 28 Python
Python+logging输出到屏幕将log日志写入文件
Nov 11 Python
详解Python中string模块除去Str还剩下什么
Nov 30 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
php获取英文姓名首字母的方法
2015/07/13 PHP
关于PHP中协程和阻塞的一些理解与思考
2017/08/11 PHP
PHP的JSON封装、转变及输出操作示例
2019/09/27 PHP
用showModalDialog弹出页面后,提交表单总是弹出一个新窗口
2009/07/18 Javascript
jQuery 技巧小结
2010/04/02 Javascript
javascript高级学习笔记整理
2011/08/14 Javascript
使用Nodejs开发微信公众号后台服务实例
2014/09/03 NodeJs
jQuery禁用快捷键例如禁用F5刷新 禁用右键菜单等的简单实现
2016/08/31 Javascript
JavaScript学习笔记整理_简单实现枚举类型,扑克牌应用
2016/09/19 Javascript
正则中的回溯定义与用法分析【JS与java实现】
2016/12/27 Javascript
AngularJs表单校验功能实例代码
2017/02/09 Javascript
Vuex和前端缓存的整合策略详解
2017/05/09 Javascript
详解Vue中状态管理Vuex
2017/05/11 Javascript
vue.js-div滚动条隐藏但有滚动效果的实现方法
2018/03/03 Javascript
详解钉钉小程序组件之自定义模态框(弹窗封装实现)
2020/03/07 Javascript
vue+ESLint 配置保存 自动格式化代码
2020/03/17 Javascript
JavaScript实现串行请求的示例代码
2020/09/14 Javascript
打开电脑上的QQ的python代码
2013/02/10 Python
使用Python发送邮件附件以定时备份MySQL的教程
2015/04/25 Python
python虚拟环境virualenv的安装与使用
2016/12/18 Python
python不换行之end=与逗号的意思及用途
2017/11/21 Python
Python中协程用法代码详解
2018/02/10 Python
解决win64 Python下安装PIL出错问题(图解)
2018/09/03 Python
Python 迭代,for...in遍历,迭代原理与应用示例
2019/10/12 Python
python函数声明和调用定义及原理详解
2019/12/02 Python
青蓝工程实施方案
2014/03/27 职场文书
英语系本科生求职信
2014/07/15 职场文书
工厂仓库管理员岗位职责
2015/04/09 职场文书
学雷锋广播稿大全
2015/08/19 职场文书
彻底理解golang中什么是nil
2021/04/29 Golang
Python爬虫之爬取最新更新的小说网站
2021/05/06 Python
mysql中between的边界,范围说明
2021/06/08 MySQL
python 常用的异步框架汇总整理
2021/06/18 Python
Python Flask搭建yolov3目标检测系统详解流程
2021/11/07 Python
关于Spring配置文件加载方式变化引发的异常详解
2022/01/18 Java/Android