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中的变量的数据类型
May 13 Python
Python解惑之True和False详解
Apr 24 Python
Python使用matplotlib和pandas实现的画图操作【经典示例】
Jun 13 Python
python数据批量写入ScrolledText的优化方法
Oct 11 Python
python执行精确的小数计算方法
Jan 21 Python
Python 实现域名解析为ip的方法
Feb 14 Python
python操作kafka实践的示例代码
Jun 19 Python
如何使用Python抓取网页tag操作
Feb 14 Python
Python中常用的高阶函数实例详解
Feb 21 Python
Python使用socket_TCP实现小文件下载功能
Oct 09 Python
pandas将list数据拆分成行或列的实现
Dec 13 Python
教你使用TensorFlow2识别验证码
Jun 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生成EXCEL的东东
2006/10/09 PHP
使用array_map简单搞定PHP删除文件、删除目录
2014/10/29 PHP
PHP中如何使用session实现保存用户登录信息
2015/10/20 PHP
thinkPHP导出csv文件及用表格输出excel的方法
2015/12/30 PHP
Smarty保留变量用法分析
2016/05/23 PHP
Laravel实现表单提交
2017/05/07 PHP
php支付宝系列之电脑网站支付
2018/05/30 PHP
JS使用parseInt解析数字实现求和的方法
2015/08/05 Javascript
CSS javascript 结合实现悬浮固定菜单效果
2015/08/23 Javascript
解决JS无法调用Controller问题的方法
2015/12/31 Javascript
js仿3366小游戏选字游戏
2016/04/14 Javascript
jQuery插件FusionCharts实现的Marimekko图效果示例【附demo源码】
2017/03/24 jQuery
vue-router实现tab标签页(单页面)详解
2017/10/17 Javascript
vue-cli设置css不生效的解决方法
2020/02/07 Javascript
举例讲解Python中is和id的用法
2015/04/03 Python
使用Python脚本操作MongoDB的教程
2015/04/16 Python
python使用socket远程连接错误处理方法
2015/04/29 Python
python中管道用法入门实例
2015/06/04 Python
Python 逐行分割大txt文件的方法
2017/10/10 Python
python 用lambda函数替换for循环的方法
2018/06/09 Python
opencv python 傅里叶变换的使用
2018/07/21 Python
python3利用Socket实现通信的方法示例
2019/05/06 Python
selenium+python环境配置教程详解
2019/05/28 Python
基于python+selenium的二次封装的实现
2020/01/06 Python
TensorBoard 计算图的可视化实现
2020/02/15 Python
Keras使用ImageNet上预训练的模型方式
2020/05/23 Python
在keras中对单一输入图像进行预测并返回预测结果操作
2020/07/09 Python
HTML5实现经典坦克大战坦克乱走还能发出一个子弹
2013/09/02 HTML / CSS
New Balance加拿大官方网站:运动鞋和健身服装
2018/11/19 全球购物
欧舒丹俄罗斯官方网站:L’OCCITANE俄罗斯
2019/11/22 全球购物
Lucene推荐的分页方式是什么?
2015/12/07 面试题
2015新学期家长寄语
2015/02/26 职场文书
个人借条范本
2015/05/25 职场文书
python正则表达式re.search()的基本使用教程
2021/05/21 Python
Python中可变和不可变对象的深入讲解
2021/08/02 Python
Redis 报错 error:NOAUTH Authentication required
2022/05/15 Redis