索引对象

pandas的索引对象负责管理轴标签和其他元数据(比如轴名称等)。构建series或DataFrame时,所用到的任何数组或其他序列的标签都会转换成一个index:

In [1]: import pandas as pd

In [2]: import numpy as np

In [3]: from pandas import Series

In [4]: obj=Series(range(3),index=['a','b','c'])

In [5]: index=obj.index

In [6]: index
Out[6]: Index(['a', 'b', 'c'], dtype='object') In [7]: index[1:]
Out[7]: Index(['b', 'c'], dtype='object')

index对象是不可修改的(immutable),因此用户不能对其进行修改

In [8]: index[1]='d'
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-8-8be6e68dba2d> in <module>()
----> 1 index[1]='d' d:\python\python36\lib\site-packages\pandas\core\indexes\base.py in __setitem__(self, key, value)
2048
2049 def __setitem__(self, key, value):
-> 2050 raise TypeError("Index does not support mutable operations")
2051
2052 def __getitem__(self, key): TypeError: Index does not support mutable operations

不可修改性非常重要,因为这样才能使Index对象在多个数据结构之间安全共享:

In [9]: index=pd.Index(np.arange(3))

In [10]: obj2=Series([1.5,-2.5,0],index=index)

In [11]: obj2.index is index
Out[11]: True In [12]: obj2.index
Out[12]: Int64Index([0, 1, 2], dtype='int64')

Index类为pandas库中内置的类。

pandas中主要的index对象:

1.index  最泛化的Index对象,将轴标签表示为一个由python对象组成的Numpy数组

2.Int64Index  针对整数的特殊Index

3.MultilIndex  “层次化”索引对象,表示单个轴上的多层索引。可以看做由元组组成的数组。

4.DatatimeIndex  存储纳秒级时间戳(用Numpy的datatime64类型表示)

5.PeriodIndex  针对Period数据(时间间隔)的特殊Index

Index的方法和属性

append   连接另一个Index对象,产生一个新的Index

diff       计算差集,并得到一个Index

intersection   计算交集

union  计算并集

isin     计算一个指示各值是否都包含在参数集合那种的布尔型数组

delete  删除索引i处的元素,并得到一个新的Index

drop  删除传入的值,并得到新的Index

insert 将元素插入到索引i处,并得到一个新的Index

is_monotonic 当各元素均大于等于前一个元素时,返回True

is_unique  当Index没有重复值时,返回True

unique  计算Index中唯一值的数组

重新索引

pandas对象的一个重要方法是reindex,其作用是创建一个适应新索引的新对象。

In [16]: obj=Series([4.5,7.3,-5.3,3.6],index=['d','b','a','c'])

In [17]: obj
Out[17]:
d 4.5
b 7.3
a -5.3
c 3.6
dtype: float64

调用该Series的reindex将会根据新索引进行重排。如果当某个索引值当前不存在,就引入缺失值:

In [18]: obj2=obj.reindex(['a','b','c','d','e'])

In [19]: obj2
Out[19]:
a -5.3
b 7.3
c 3.6
d 4.5
e NaN
dtype: float64
In [22]: obj.reindex(['a','b','c','d','e'],fill_value=0)
Out[22]:
a -5.3
b 7.3
c 3.6
d 4.5
e 0.0
dtype: float64

对于时间序列这样的有序数据,重新索引可能需要做一些插值处理。method选项可以达到这个目的。

使用ffill可以实现前向值填充:

In [23]: obj3=Series(['blue','purple','yellow'],index=[0,2,4])

In [24]: obj3.reindex(range(6),method='ffill')
Out[24]:
0 blue
1 blue
2 purple
3 purple
4 yellow
5 yellow
dtype: object

reindex的(插值)method选项:

ffill 或pad    前向填充(或搬运)值

bfill 或backfill  后向填充(或搬运)值

对于DataFrame,reindex可以修改(行)索引 丶列,或2个都修改。如果仅传入一个序列,则会重新索引行:

In [26]: from pandas import DataFrame

In [27]: frame = DataFrame(np.arange(9).reshape((3,3)),index=['a','c','d'],columns=['Ohio','Texas','California'])

In [28]: frame
Out[28]:
Ohio Texas California
a 0 1 2
c 3 4 5
d 6 7 8 In [29]: frame2=frame.reindex(['a','b','c','d']) In [30]: frame2
Out[30]:
Ohio Texas California
a 0.0 1.0 2.0
b NaN NaN NaN
c 3.0 4.0 5.0
d 6.0 7.0 8.0

使用columns关键字可以重新索引列:

In [31]: states=['Texas','Utah','California']

In [32]: frame.reindex(columns=states)
Out[32]:
Texas Utah California
a 1 NaN 2
c 4 NaN 5
d 7 NaN 8

也可以同时对行和列进行重新索引,而插值则只能按行应用:

In [44]: frame.reindex(index=['a','b','c','d'],method='ffill')
Out[44]:
Ohio Texas California
a 0 1 2
b 0 1 2
c 3 4 5
d 6 7 8
In [46]: frame.reindex(index=['a','b','c','d'],method='ffill').reindex(columns=states)
Out[46]:
Texas Utah California
a 1 NaN 2
b 1 NaN 2
c 4 NaN 5
d 7 NaN 8

利用ix的标签索引功能,重新索引任务可以变得更简洁:

In [54]: frame.ix[['a','b','c','d'],states]
Out[54]:
Texas Utah California
a 1.0 NaN 2.0
b NaN NaN NaN
c 4.0 NaN 5.0
d 7.0 NaN 8.0

reindex函数的参数:

  index:作为索引的新序列。既可以是index实例也可以是其他序列型的python数据结构。index会被完全使用,就像没有任何复制一样。

  method:插值(填充)方式,参数(fill丶pad丶bfill丶backfill)

  fill_value:在重新索引的过程中,需要引入缺失值使用的任何替代值。

  limit:前向或后向填充时的最大填充量。

  level:在MultiIndex的指定级别上匹配简单索引,否则选取子集。

  copy:默认为True,无论如何都复制;如果为false,则新旧相等就不复制。

丢弃指定轴上的项

丢弃某条轴上的一个或多个项很简单,只要有一个索引数组或列表即可。由于需要执行一些数据整理和集合逻辑,所以drop方法返回的是一个在指定轴上删除了指定值的新对象:

In [13]: obj=Series(np.arange(5.),index=['a','b','c','d','e'])

In [14]: new_obj=obj.drop('c')

In [15]: new_obj
Out[15]:
a 0.0
b 1.0
d 3.0
e 4.0
dtype: float64 In [16]: obj.drop(['d','c'])
Out[16]:
a 0.0
b 1.0
e 4.0
dtype: float64 In [17]: obj
Out[17]:
a 0.0
b 1.0
c 2.0
d 3.0
e 4.0
dtype: float64

注意:drop后返回的是一个新的对象,原始的不改变。

对于DataFrame,可以删除任意轴上的索引值:

In [19]: data=DataFrame(np.arange(16).reshape((4,4)),index=['a','b','c','d'],columns=['','','',''])

In [20]: data
Out[20]:
1 2 3 4
a 0 1 2 3
b 4 5 6 7
c 8 9 10 11
d 12 13 14 15 In [21]: data.drop(['a','c'])
Out[21]:
1 2 3 4
b 4 5 6 7
d 12 13 14 15 In [22]: data.drop('',axis=1)
Out[22]:
1 3 4
a 0 2 3
b 4 6 7
c 8 10 11
d 12 14 15 In [28]: data.drop(['1','3'],axis=1)
Out[28]:
    2   4
a   1   3
b   5   7
c   9  11
d  13  15

索引丶选取和过滤

Series索引的工作方式类似于NumPy数组的索引,只不过Series索引值不只是整数。

In [29]: obj=Series(np.arange(5),index=['a','b','c','d','e'])

In [30]: obj
Out[30]:
a 0
b 1
c 2
d 3
e 4
dtype: int32 In [31]: obj['b']
Out[31]: 1 In [32]: obj[1]
Out[32]: 1 In [33]: obj[2:4]
Out[33]:
c 2
d 3
dtype: int32 In [34]: obj[obj<2]
Out[34]:
a 0
b 1
dtype: int32 In [35]: obj[['a','c','d']]
Out[35]:
a 0
c 2
d 3
dtype: int32 In [36]: obj[[1,3,4]]
Out[36]:
b 1
d 3
e 4
dtype: int32

利用标签的切片运算与普通的python切片运算不同,末端是包含的封闭区间。

In [37]: obj[['a','c']]
Out[37]:
a 0
c 2
dtype: int32

设置的方式也很简单:

In [38]: obj
Out[38]:
a 0
b 1
c 2
d 3
e 4
dtype: int32 In [39]: obj[['a','c']]=6 In [40]: obj
Out[40]:
a 6
b 1
c 6
d 3
e 4
dtype: int32

对DataFrame索引就是获取一个或多个列:

In [41]: data
Out[41]:
1 2 3 4
a 0 1 2 3
b 4 5 6 7
c 8 9 10 11
d 12 13 14 15 In [42]: data['']
Out[42]:
a 0
b 4
c 8
d 12
Name: 1, dtype: int32 In [43]: data[['','']]
Out[43]:
1 3
a 0 2
b 4 6
c 8 10
d 12 14

这种索引方式有几个特殊的情况。首先通过切片或布尔型数组选取行:

In [44]: data[:2]
Out[44]:
1 2 3 4
a 0 1 2 3
b 4 5 6 7 In [45]: data[data['']>5]
Out[45]:
1 2 3 4
c 8 9 10 11
d 12 13 14 15

另一种用法是通过布尔型DataFrame进行索引:

In [46]: data<5
Out[46]:
1 2 3 4
a True True True True
b True False False False
c False False False False
d False False False False In [47]: data[data<5]
Out[47]:
1 2 3 4
a 0.0 1.0 2.0 3.0
b 4.0 NaN NaN NaN
c NaN NaN NaN NaN
d NaN NaN NaN NaN

这段代码的目的是使DataFrame在语法上更像ndarry。

pandas入门学习的更多相关文章

  1. pandas入门学习--------------------------(一)

    使用pandas,首先需要熟悉它的2个主要的数据结构:Series和DataFrame. Series series是一种类似于一维数组的的对象,它由一组数据(各种Numpy数据类型)以及一组与之相关 ...

  2. pandas库学习笔记(二)DataFrame入门学习

    Pandas基本介绍——DataFrame入门学习 前篇文章中,小生初步介绍pandas库中的Series结构的创建与运算,今天小生继续“死磕自己”为大家介绍pandas库的另一种最为常见的数据结构D ...

  3. Python 数据处理库 pandas 入门教程

    Python 数据处理库 pandas 入门教程2018/04/17 · 工具与框架 · Pandas, Python 原文出处: 强波的技术博客 pandas是一个Python语言的软件包,在我们使 ...

  4. 利用python进行数据分析之pandas入门

    转自https://zhuanlan.zhihu.com/p/26100976 目录: 5.1 pandas 的数据结构介绍5.1.1 Series5.1.2 DataFrame5.1.3索引对象5. ...

  5. vue入门学习(基础篇)

    vue入门学习总结: vue的一个组件包括三部分:template.style.script. vue的数据在data中定义使用. 数据渲染指令:v-text.v-html.{{}}. 隐藏未编译的标 ...

  6. Hadoop入门学习笔记---part4

    紧接着<Hadoop入门学习笔记---part3>中的继续了解如何用java在程序中操作HDFS. 众所周知,对文件的操作无非是创建,查看,下载,删除.下面我们就开始应用java程序进行操 ...

  7. Hadoop入门学习笔记---part3

    2015年元旦,好好学习,天天向上.良好的开端是成功的一半,任何学习都不能中断,只有坚持才会出结果.继续学习Hadoop.冰冻三尺,非一日之寒! 经过Hadoop的伪分布集群环境的搭建,基本对Hado ...

  8. PyQt4入门学习笔记(三)

    # PyQt4入门学习笔记(三) PyQt4内的布局 布局方式是我们控制我们的GUI页面内各个控件的排放位置的.我们可以通过两种基本方式来控制: 1.绝对位置 2.layout类 绝对位置 这种方式要 ...

  9. PyQt4入门学习笔记(一)

    PyQt4入门学习笔记(一) 一直没有找到什么好的pyqt4的教程,偶然在google上搜到一篇不错的入门文档,翻译过来,留以后再复习. 原始链接如下: http://zetcode.com/gui/ ...

随机推荐

  1. java面试题大纲

    跳槽时时刻刻都在发生,但是我建议大家跳槽之前,先想清楚为什么要跳槽.切不可跟风,看到同事一个个都走了,自己也盲目的开始面试起来(期间也没有准备充分),到底是因为技术原因(影响自己的发展,偏移自己规划的 ...

  2. 原 the app referencesnon-public selectors in payload

    摘要 当我们上传验证的时候,出现了the app referencesnon-public selectors in payload/项目名.app/项目:字符 的警告的解决办法 当我们上传验证的时候 ...

  3. swift 函数参数——实参与形参

    实参 在传入函数之前已有明确定义. 具体定义为 func funcName( actualParameter: Type ) {} 形参 参数只在此函数内有效并可使用,函数外不需要有明确定义. 具体定 ...

  4. 【剑指offer-25】合并两个单调递增的链表,C++实现(链表)

    原创博客,转载请注明出处! 1.题目 输入两个单调递增的链表,输出两个链表合成后的链表(单调不减). 2.思路(递归) # 鲁棒性: 如果链表1是空链表,则直接输出链表2. 如果链表2是空链表,则直接 ...

  5. del语句的总结

    删除属性 del 语句 可以删除对象(实例)的属性 语法: del 对象.实例变量名 del 语句 del 变量名 删除变量 del name del 列表[整数表达式] 删除列表中的元素 del L ...

  6. 每天一个linux命令:【转载】less命令

    less 工具也是对文件或其它输出进行分页显示的工具,应该说是linux正统查看文件内容的工具,功能极其强大.less 的用法比起 more 更加的有弹性.在 more 的时候,我们并没有办法向前面翻 ...

  7. Redis构建全局并发锁

    Redis构建全局并发锁 https://www.cnblogs.com/FG123/p/9990336.html 谈起Redis的用途,小伙伴们都会说使用它作为缓存,目前很多公司都用Redis作为缓 ...

  8. tableview小结-初学者的问题

    初学者的问题主要集中在,下面几个问题: 一.几个函数总是不被调用:例如: - (UIView *)tableView:(UITableView *)tableView viewForHeaderInS ...

  9. ubuntu scrapy 开发环境搭建

    我的版本是14.04 1.更新系统  ##如果系统没有换国内下载路径需要换下系统的更新下载路径 http://www.cnblogs.com/seablog/p/7043798.html sudo a ...

  10. Altera的几个常用的Synthesis attributes(转载)

    各厂商综合工具,对HDL综合时都定义了一些综合属性这些属性可指定a declaration,a module item,a statement, or a port connection 不同的综合方 ...