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随机数random模块使用指南
Sep 09 Python
Python实现对字符串的加密解密方法示例
Apr 29 Python
Python模糊查询本地文件夹去除文件后缀的实例(7行代码)
Nov 09 Python
Python实现读写INI配置文件的方法示例
Jun 09 Python
Python下opencv图像阈值处理的使用笔记
Aug 04 Python
Python基于read(size)方法读取超大文件
Mar 12 Python
python实现图片转换成素描和漫画格式
Aug 19 Python
Python实例方法、类方法、静态方法区别详解
Sep 05 Python
PyTorch中的拷贝与就地操作详解
Dec 09 Python
用Python进行栅格数据的分区统计和批量提取
May 27 Python
使用Django实现商城验证码模块的方法
Jun 01 Python
在Python中如何使用yield
Jun 07 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/12/05 PHP
PHP 中英文混合排版中处理字符串常用的函数
2007/04/12 PHP
PHP输出日历表代码实例
2015/03/27 PHP
php超快高效率统计大文件行数
2015/07/05 PHP
php 把数字转换成汉字的代码
2015/07/21 PHP
PHP中file_get_contents函数抓取https地址出错的解决方法(两种方法)
2015/09/22 PHP
php脚本运行时的超时机制详解
2016/02/17 PHP
javascript如何使用bind指定接收者
2014/05/04 Javascript
Shell脚本实现Linux系统和进程资源监控
2015/03/05 Javascript
seajs模块之间依赖的加载以及模块的执行
2016/10/21 Javascript
Bootstrap布局之栅格系统学习笔记
2017/05/04 Javascript
JQuery 选择器、DOM节点操作练习实例
2017/09/28 jQuery
vue之浏览器存储方法封装实例
2018/03/15 Javascript
React Native开发封装Toast与加载Loading组件示例
2018/09/08 Javascript
jQuery操作动画完整实例分析
2020/01/10 jQuery
javascript中contains是否包含功能实现代码(扩展字符、数组、dom)
2020/04/07 Javascript
微信小程序实现watch监听
2020/06/04 Javascript
[05:02][DOTA2]DOTA进化论 第一期
2013/09/27 DOTA
[09:37]2018DOTA2国际邀请赛寻真——不懈追梦的Team Serenity
2018/08/13 DOTA
介绍Python的Django框架中的QuerySets
2015/04/20 Python
windows 下python+numpy安装实用教程
2017/12/23 Python
关于python列表增加元素的三种操作方法
2018/08/22 Python
python挖矿算力测试程序详解
2019/07/03 Python
中国最大的潮流商品购物网站:YOHO!BUY有货
2017/01/07 全球购物
美国最大的农村生活方式零售店:Tractor Supply Company(TSC)
2017/05/15 全球购物
serialVersionUID具有什么样的特征
2014/02/20 面试题
银行实习自我鉴定
2013/10/12 职场文书
车间副主任岗位职责
2013/12/24 职场文书
咖啡书吧创业计划书
2014/01/13 职场文书
护士岗位求职应聘自荐书范文
2014/02/12 职场文书
材料加工工程求职信
2014/02/19 职场文书
2014年元旦促销活动方案
2014/02/22 职场文书
大学学生会辞职信
2015/05/13 职场文书
小学生安全教育主题班会
2015/08/12 职场文书
详解CSS玩转图片Base64编码
2021/05/25 HTML / CSS
在前女友婚礼上,用Python破解了现场的WIFI还把名称改成了
2021/05/28 Python