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 相关文章推荐
利用Django框架中select_related和prefetch_related函数对数据库查询优化
Apr 01 Python
Python实现判断一行代码是否为注释的方法
May 23 Python
利用python打开摄像头及颜色检测方法
Aug 03 Python
python快速编写单行注释多行注释的方法
Jul 31 Python
使用keras框架cnn+ctc_loss识别不定长字符图片操作
Jun 29 Python
Keras中 ImageDataGenerator函数的参数用法
Jul 03 Python
面向新手解析python Beautiful Soup基本用法
Jul 11 Python
详解pyqt5的UI中嵌入matplotlib图形并实时刷新(挖坑和填坑)
Aug 07 Python
如何真正的了解python装饰器
Aug 14 Python
Python字符串三种格式化输出
Sep 17 Python
python解包用法详解
Feb 17 Python
使用Python开发贪吃蛇游戏 SnakeGame
Apr 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
php生成数组的使用示例 php全组合算法
2014/01/16 PHP
php截取字符串之截取utf8或gbk编码的中英文字符串示例
2014/03/12 PHP
CMS中PHP判断系统是否已经安装的方法示例
2014/07/26 PHP
详解PHP的Yii框架中组件行为的属性注入和方法注入
2016/03/18 PHP
Alliance vs AM BO3 第二场2.13
2021/03/10 DOTA
JavaScript函数作用域链分析
2015/02/13 Javascript
18个非常棒的jQuery代码片段
2015/11/02 Javascript
使用angularjs创建简单表格
2016/01/21 Javascript
jQuery Validate插件实现表单验证
2016/08/19 Javascript
让浏览器崩溃的12行JS代码(DoS攻击分析及防御)
2016/10/10 Javascript
nodejs中向HTTP响应传送进程的输出
2017/03/19 NodeJs
MVVM框架下实现分页功能示例
2018/06/14 Javascript
微信小程序云开发之使用云数据库
2019/05/17 Javascript
Vue 实现复制功能,不需要任何结构内容直接复制方式
2019/11/09 Javascript
原生JavaScript实现贪吃蛇游戏
2020/11/04 Javascript
Python开发WebService系列教程之REST,web.py,eurasia,Django
2014/06/30 Python
浅谈python日志的配置文件路径问题
2018/04/28 Python
python实现ftp文件传输系统(案例分析)
2020/03/20 Python
Python2.x与3​​.x版本有哪些区别
2020/07/09 Python
Selenium python时间控件输入问题解决方案
2020/07/22 Python
Python实现Word文档转换Markdown的示例
2020/12/22 Python
Django项目在pycharm新建的步骤方法
2021/03/02 Python
医学院毕业生自荐信
2013/11/08 职场文书
大学生自助营养快餐店创业计划书
2014/01/13 职场文书
烹饪自我鉴定
2014/03/01 职场文书
大学生全国两会报告感想
2014/03/17 职场文书
公司合作协议书范本
2014/04/18 职场文书
学习十八大演讲稿
2014/09/15 职场文书
房屋出租委托书格式
2014/09/23 职场文书
教师拔河比赛广播稿
2014/10/14 职场文书
2014年高中班主任工作总结
2014/11/08 职场文书
2014年教师思想工作总结
2014/12/03 职场文书
2015年秋季运动会前导词
2015/07/20 职场文书
素质拓展训练感想
2015/08/07 职场文书
《富饶的西沙群岛》教学反思
2016/02/16 职场文书
如何利用golang运用mysql数据库
2022/03/13 Golang