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的chardet库获得文件编码并修改编码
Jan 22 Python
python调用java模块SmartXLS和jpype修改excel文件的方法
Apr 28 Python
Python实现将不规范的英文名字首字母大写
Nov 15 Python
Django学习笔记之Class-Based-View
Feb 15 Python
Python方法的延迟加载的示例代码
Dec 18 Python
python线程中同步锁详解
Apr 27 Python
利用Python对文件夹下图片数据进行批量改名的代码实例
Feb 21 Python
Python寻找路径和查找文件路径的示例
Jul 10 Python
Python从文件中读取指定的行以及在文件指定位置写入
Sep 06 Python
python读取文件指定行内容实例讲解
Mar 02 Python
Django给表单添加honeypot验证增加安全性
May 06 Python
Python序列化与反序列化相关知识总结
Jun 08 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
二次元帅气男生排行榜,只想悄悄收藏系列
2020/03/04 日漫
PHP 常见郁闷问题答解
2006/11/25 PHP
php GD绘制24小时柱状图
2008/06/28 PHP
php中几种常见安全设置详解
2010/04/06 PHP
真正根据utf8编码的规律来进行截取字符串的函数(utf8版sub_str )
2012/10/24 PHP
php合并js请求的例子
2013/11/01 PHP
PHP生成sitemap.xml地图函数
2013/11/13 PHP
将FCKeditor导入PHP+SMARTY的实现方法
2015/01/15 PHP
PHP智能识别收货地址信息实例
2019/01/05 PHP
一些易混淆且不常用的属性,希望有用
2007/01/29 Javascript
基于Jquery的温度计动画效果
2010/06/18 Javascript
js中关于一个分号的崩溃示例
2013/11/11 Javascript
Javascript中数组方法汇总(推荐)
2015/04/01 Javascript
JavaScript中获取Radio被选中的值
2015/11/11 Javascript
一步一步封装自己的HtmlHelper组件BootstrapHelper(二)
2016/09/14 Javascript
微信小程序实现传参数的几种方法示例
2018/01/10 Javascript
微信小程序修改swiper默认指示器样式的实例代码
2018/07/18 Javascript
JavaScript数组排序的六种常见算法总结
2020/08/18 Javascript
微信小程序开发数据缓存基础知识辨析及运用实例详解
2020/11/06 Javascript
Python logging模块学习笔记
2014/05/24 Python
介绍Python中的一些高级编程技巧
2015/04/02 Python
Python读写txt文本文件的操作方法全解析
2016/06/26 Python
python list元素为tuple时的排序方法
2018/04/18 Python
对pandas中Series的map函数详解
2018/07/25 Python
Python 实现交换矩阵的行示例
2019/06/26 Python
HUGO BOSS美国官方网上商店:世界知名奢侈品牌
2017/08/04 全球购物
高中生毕业学习总结的自我评价
2013/11/14 职场文书
小学生新学期寄语
2014/01/19 职场文书
教师廉洁自律个人总结
2015/02/10 职场文书
管理失职检讨书范文
2015/05/05 职场文书
实验心得体会范文
2016/01/25 职场文书
幼儿园大班教师评语
2019/06/21 职场文书
Spring Cache和EhCache实现缓存管理方式
2021/06/15 Java/Android
Spring实现内置监听器
2021/07/09 Java/Android
JavaScript中时间格式化新思路toLocaleString()
2021/11/07 Javascript
python实现手机推送 代码也就10行左右
2022/04/12 Python