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模拟登录12306的方法
Dec 30 Python
在Linux下调试Python代码的各种方法
Apr 17 Python
python魔法方法-自定义序列详解
Jul 21 Python
Python如何实现守护进程的方法示例
Feb 08 Python
python实现手机通讯录搜索功能
Feb 22 Python
Python3中详解fabfile的编写
Jun 24 Python
python中partial()基础用法说明
Dec 30 Python
Python3+Pycharm+PyQt5环境搭建步骤图文详解
May 29 Python
最简单的matplotlib安装教程(小白)
Jul 28 Python
python 6种方法实现单例模式
Dec 15 Python
Matplotlib中rcParams使用方法
Jan 05 Python
Python爬取你好李焕英豆瓣短评生成词云的示例代码
Feb 24 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 或网站服务器日志,并正确配置 PHP 安装最快的解决办法
2010/08/01 PHP
将一维或多维的数组连接成一个字符串的php代码
2010/08/08 PHP
php单态设计模式(单例模式)实例
2014/11/18 PHP
php面向对象之反射功能与用法分析
2017/03/29 PHP
js中top、clientTop、scrollTop、offsetTop的区别 文字详细说明版
2011/01/08 Javascript
使用Jquery打造最佳用户体验的登录页面的实现代码
2011/07/08 Javascript
JavaScript判断DOM何时加载完毕的技巧
2012/11/11 Javascript
js 在定义的时候立即执行的函数表达式(function)写法
2013/01/16 Javascript
jquery获取table中的某行全部td的内容方法
2013/03/08 Javascript
jquery仿QQ商城带左右按钮控制焦点图片切换滚动效果
2013/06/27 Javascript
浅析onsubmit校验表单时利用ajax的return false无效问题
2013/07/10 Javascript
基于Bootstrap+jQuery.validate实现Form表单验证
2014/12/16 Javascript
jQuery中get()方法用法实例
2014/12/27 Javascript
JS获取表格内指定单元格html内容的方法
2015/03/31 Javascript
js中跨域方法原理详解
2015/07/19 Javascript
javascript字符串函数汇总
2015/12/06 Javascript
理解javascript中try...catch...finally
2015/12/25 Javascript
js 判断一组日期是否是连续的简单实例
2016/07/11 Javascript
微信JS-SDK选取手机照片上传功能
2017/04/21 Javascript
JavaScript中附件预览功能实现详解(推荐)
2017/08/15 Javascript
Element UI框架中巧用树选择器的实现
2018/12/12 Javascript
webpack4.0+vue2.0利用批处理生成前端单页或多页应用的方法
2019/06/28 Javascript
Jquery+AJAX实现无刷新上传并重命名文件操作示例【PHP后台接收】
2020/05/29 jQuery
编写v-for循环的技巧汇总
2020/12/01 Javascript
Python selenium 三种等待方式详解(必会)
2016/09/15 Python
python实现ID3决策树算法
2017/12/20 Python
Python之Scrapy爬虫框架安装及简单使用详解
2017/12/22 Python
Python import与from import使用及区别介绍
2018/09/06 Python
Python Flask 搭建微信小程序后台详解
2019/05/06 Python
Python3分析处理声音数据的例子
2019/08/27 Python
python 3.8.3 安装配置图文教程
2020/05/21 Python
美国本地交易和折扣网站:LocalFlavor.com
2017/10/26 全球购物
什么是.net
2015/08/03 面试题
函授教育个人学习的自我评价
2013/12/31 职场文书
2015年高三教学工作总结
2015/07/21 职场文书
浅析Python中的套接字编程
2021/06/22 Python