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 14 Python
Python使用while循环花式打印乘法表
Jan 28 Python
Python实现的爬取百度文库功能示例
Feb 16 Python
详解python中@的用法
Mar 27 Python
Python-while 计算100以内奇数和的方法
Jun 11 Python
解决安装python3.7.4报错Can''t connect to HTTPS URL because the SSL module is not available
Jul 31 Python
python实现机器人卡牌
Oct 06 Python
python标识符命名规范原理解析
Jan 10 Python
Python小整数对象池和字符串intern实例解析
Mar 21 Python
Python替换NumPy数组中大于某个值的所有元素实例
Jun 08 Python
python 如何停止一个死循环的线程
Nov 24 Python
使用Python解决图表与画布的间距问题
Apr 11 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 反向排序和随机排序代码
2010/06/30 PHP
C#使用PHP服务端的Web Service通信实例
2014/04/08 PHP
PHP防止post重复提交数据的简单例子
2014/06/07 PHP
php获取json数据所有的节点路径
2015/05/17 PHP
实例讲解php数据访问
2016/05/09 PHP
JSON与XML优缺点对比分析
2015/07/17 Javascript
JS使用正则表达式除去字符串中重复字符的方法
2015/11/05 Javascript
JavaScript“尽快失败”的原则实例详解
2016/10/08 Javascript
jQuery Checkbox 全选 反选的简单实例
2016/11/29 Javascript
jquery插入兄弟节点的操作方法
2016/12/07 Javascript
Vue2.0父组件与子组件之间的事件发射与接收实例代码
2017/09/19 Javascript
JS实现图片居中悬浮效果
2017/12/25 Javascript
Vue CLI 3搭建vue+vuex最全分析(推荐)
2018/09/27 Javascript
Vue 指令实现按钮级别权限管理功能
2019/04/23 Javascript
JS中call()和apply()的功能及用法实例分析
2019/06/28 Javascript
解决layui数据表格table的横向滚动条显示问题
2019/09/04 Javascript
javascript 模块依赖管理的本质深入详解
2020/04/30 Javascript
javascript实现京东快递单号的查询效果
2020/11/30 Javascript
Python实现从url中提取域名的几种方法
2014/09/26 Python
Django日志模块logging的配置详解
2017/02/14 Python
python爬虫爬取某站上海租房图片
2018/02/04 Python
简单了解python的break、continue、pass
2019/07/08 Python
win10系统下python3安装及pip换源和使用教程
2020/01/06 Python
解决python父线程关闭后子线程不关闭问题
2020/04/25 Python
Django中文件上传和文件访问微项目的方法
2020/04/27 Python
python定义类的简单用法
2020/07/24 Python
css3 transform属性详解
2014/09/30 HTML / CSS
关于Assembly命名空间的三个面试题
2015/07/23 面试题
本科毕业生专业自荐书范文
2014/02/05 职场文书
面试自我介绍演讲稿
2014/04/29 职场文书
美食节目策划方案
2014/05/31 职场文书
培训研修方案
2014/06/06 职场文书
出纳年终工作总结2014
2014/12/05 职场文书
教师考核表个人总结
2015/02/12 职场文书
2016年119消防宣传日活动总结
2016/04/05 职场文书
索尼ICF-36收音机评测
2022/04/30 无线电