首页
学习
活动
专区
工具
TVP
发布

机器学习之计算工具库(三)

标题

pandas的数据结构

Series对象

DataFrame对象

索引对象

基本功能

重新索引

丢弃轴上指定项

pandas是基于Numpy构建的,它让以Numpy为中心的应用变得更加简单。通常我们会以如下方式引入pandas库

因为Series和DataFrame非常常用,所以将其引入本地命名空间会方便些。

pandas的数据结构

Series对象

Series类似与一维数组,由一个numpy数组和索引组成(索引和数组元素一一对应),一下是一个Series对象

我们可以看到索引在左边,值在右边,由于我们没有指定数组的索引,因此会自动创建到N-1的整数型索引(其中N为元素的个数),如果我们要指定索引的话我们可以传入index参数。

并且我们可以通过.index访问实例对象的index对象。

Series对象可以使用切片、布尔型数组、花式索引等索引方法,用法与Numpy数组相同。并且可以使用索引的来选取Series的值。

Series对象运算(如备选数组索引,标量乘法,应用数学函数等)时会保留索引和值的链接。如上图所示,使用布尔型索引和花式索引时,仍可以看到左边是索引,右边是值。

Series对象可以从Numpy数组、Python列表、元组以及字典创建。根据数组列表元组创建Series上面已经给出例子。但是如果从字典中创建Series对象的话,字典的键会变成索引,字典的值会变成索引对应的值。(Series元素的顺序为字典里键的顺序)

因此我们也可以吧Series看作定长的字典,因为它表示了从索引到值的映射。

Series对象还有数据对齐功能,以下是例子

由上面的例子我可以看到,索引相同的值相加,而由于s3的没有索引'b',所以与s2['b']的和为缺失值NAN。我们可以使用以下方法判断缺失值

Series.index还有name属性,可以直接通过赋值去修改。

DataFrame

DataFrame是一个表格型的数据结构,既有行索引,也有列索引(表头),每一行每一列都可以看成一个Series。

DataFrame有以下创建方法

类型

说明

二维数组

数据矩阵,可以传入行索引和列索引

数组、列表或者元组组成的字典

每个序列会变成DataFrame的一列,所以序列的长度必须相同

Numpy结构化、记录数组

类似于“由数组组成的字典”

字典组成的

字典

外层的键会变成列索引,

里面的键会变成行索引

字典或Series组成的列表

所有Series的索引或字典的键的并集会变DataFrame的列索引,每行对应一个数据

另一个DataFrame

沿用该DataFrame的索引除非显示指定新索引

Numpy

MaskedArray

类似于二维ndarray,只是掩码值在结果DataFrame中会变成NAN

例如传入二维数组

传入列表组成的字典,键会变成列索引,列表会变成DataFrame中的一列。

传入字典组成的字典,外层的键'b','d'为列索引,内层的键为行索引

传入Series组成的列表

可以看到第一行的数据是s1的数据,第二行是s2的数据。

有关于DataFrame的创建就说到这里,接下来一下对DataFrame的修改。在DataFrame中我们仍可以通过索引来进行数据的选取,但是要注意第一个中括号是索引对应列,第二个中括号才是索引行。如果我们想直接索引某一行的话我们可以使用.loc或者.iloc,其中loc是针对索引的选取方法,而iloc则是针对于行号的选取方法。

如果我们要同时修改某一列(行),如果你先用一个数组、列表之类的去替换某列,则列表的长度必须和DataFrame的行数相等,否则不能赋值。

若将Series对象赋值给某列的话,则会发生数据对齐,DataFrame的行索引与Series行索引一样的元素直接赋值,其余值一并变成NAN。

如上例所示,Seriesd1都含有索引1 2,所以该位置的元素被成功覆盖。由于DataFrame没有为4的索引而且索引和3的值没有指定,因此索引为和3的值为NAN。

索引对象

我们知道Series和DataFrame都会有索引对象,并且索引对象是不可以修改的,但是却可以重复。pandas中主要的index对象如下

说明

Index

最泛化的索引对象,将轴标签表示为由Python对象组成的Numpy数组

Int64Index

针对整数的特殊Index

MultiIndex

层次化索引对象,可以看成由元组组成的数组

DatetimeIndex

存储纳秒级时间戳(Numpy.datetime64)

PeriodIndex

针对Period数据的特殊index

索引有着集合一样的方法,可以计算索引之间的交并补差,判断包含、唯一,还可以插入和删除(会返回一个新的index对象)

基本功能

重新索引

因为index对象不可以修改,所以我们需要通过reindex( [index] )方法按顺序覆盖索引,若传入的索引之前不存在,则对应的值为NAN。(注意reindex返回一个新的Series,不修改原来的Series

我们可以设定fill_value参数使得之前不存在的索引的初值为fill_value,同时reindex中还有一个参数method用于数据填充(插值)。

因为这里索引是整型可以比较大小(时间索引同理),前向填充'ffill'默认从小的向大的地方填充,由于原来的s1的值为[ 1,3,5,7 ],索引为[ 0,1,2,3 ],但是由于索引0,1,2原来已存在,故不能填充,但是3之后的索引不存在,故3之后的索引的值填充为7,后向填充'bfill'也是同理。

DataFrame的reindex方法也是类似的,默认是对行索引重置,若想对列索引重置使用column参数即可。但是DataFrame的插值只能按行应用。

reindex还有limit(最大填充量)、copy(True无论如何都复制、False则当且仅当新旧一致时不复制)等参数。有兴趣的朋友可以自行去尝试。

丢弃轴上指定项

若要删除Series或DataFrame的某个项,可以通过drop方法返回一个删除该项的新对象

本期的内容就到这里,下期为大家继续介Pandas库的其他基本操作。

参考资料

《利用Python进行数据分析》 机械工业出版社 WesMcKinney著 唐学韬等译

以及晚上各位大佬的博文

AI遇见机器学习

mltoai

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180119G11D2P00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券