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 相关文章推荐
200行自定义python异步非阻塞Web框架
Mar 15 Python
python爬虫基本知识
Mar 05 Python
为什么入门大数据选择Python而不是Java?
Mar 07 Python
对python dataframe逻辑取值的方法详解
Jan 30 Python
python自定义函数实现最大值的输出方法
Jul 09 Python
tensorflow模型继续训练 fineturn实例
Jan 21 Python
python实现图像全景拼接
Mar 27 Python
哪种Python框架适合你?简单介绍几种主流Python框架
Aug 04 Python
用基于python的appium爬取b站直播消费记录
Apr 17 Python
Python关于OS文件目录处理的实例分享
May 23 Python
python 办公自动化——基于pyqt5和openpyxl统计符合要求的名单
May 25 Python
Python 中的 copy()和deepcopy()
Nov 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
php_screw安装使用教程(另一个PHP代码加密实现)
2014/05/29 PHP
PHP+mysql实现的三级联动菜单功能示例
2019/02/15 PHP
PhpStorm+xdebug+postman调试技巧分享
2020/09/15 PHP
基于jquery的放大镜效果
2012/05/30 Javascript
js获取单选框或复选框值及操作
2012/12/18 Javascript
js模拟select下拉菜单控件的代码
2013/05/08 Javascript
jQuery中innerWidth()方法用法实例
2015/01/19 Javascript
jQuery实现的图文高亮滚动切换特效实例
2015/08/10 Javascript
jquery实现通用的内容渐显Tab选项卡效果
2015/09/07 Javascript
Bootstrap入门书籍之(四)菜单、按钮及导航
2016/02/17 Javascript
JS根据浏览器窗口大小实时动态改变网页文字大小的方法
2016/02/25 Javascript
javascript中eval解析JSON字符串
2016/02/27 Javascript
JQuery点击行tr实现checkBox选中的简单实例
2016/05/26 Javascript
Bootstrap作品展示站点实战项目2
2016/10/14 Javascript
JS组件系列之MVVM组件 vue 30分钟搞定前端增删改查
2017/04/28 Javascript
vue-cli的eslint相关用法
2017/09/29 Javascript
浅谈webpack编译vue项目生成的代码探索
2017/12/11 Javascript
JS使用正则表达式获取小括号、中括号及花括号内容的方法示例
2018/06/01 Javascript
微信小程序外卖选购页实现切换分类与数量加减功能案例
2019/01/15 Javascript
vue使用video插件vue-video-player的示例
2020/10/03 Javascript
Python实现端口复用实例代码
2014/07/03 Python
Python 爬虫学习笔记之正则表达式
2016/09/21 Python
快速入门python学习笔记
2017/12/06 Python
Python学习笔记之自定义函数用法详解
2019/06/08 Python
python飞机大战pygame游戏背景设计详解
2019/12/17 Python
Python中itertools的用法详解
2020/02/07 Python
CSS Grid布局教程之浏览器开启CSS Grid Layout汇总
2014/12/30 HTML / CSS
世界上最大的艺术社区:SAA
2020/12/30 全球购物
Linux面试题LINUX系统类
2014/11/19 面试题
创业女性典型材料
2014/05/02 职场文书
体育馆的标语
2014/06/24 职场文书
经济类毕业生求职信
2014/06/26 职场文书
2015年“我们的节日·重阳节”活动总结
2015/07/29 职场文书
家长会感言
2015/08/01 职场文书
golang 如何通过反射创建新对象
2021/04/28 Golang
Python编程根据字典列表相同键的值进行合并
2021/10/05 Python