Pandas——索引对象

简单索引对象

pandas中,索引对象负责管理轴标签和其它元数据,Series和DataFrame的索引实际上都是Index对象。Series类和DataFrame类对象的index属性返回的就是索引对象,
在这里插入图片描述
Index对象形式上很像一个numpy的array,但是Index对象是不能修改的,下面这种试图直接修改Index对象的方式一定会报错,
在这里插入图片描述
不可修改的属性非常重要,因为不可修改,所以在多个数据结构之间能够安全共享,
在这里插入图片描述
Index类是最笼统的索引类,向下继承的还有多种Index类的子类,
在这里插入图片描述

索引对象简单运算

Index对象形式上像数组,但是不可改变。不可变的这一特性类似于Python内置类型的元组和集合。相应的运算也与集合类似,能够参与逻辑运算
在这里插入图片描述
此外,不同索引对象之间的运算也与元组和集合很相近,
在这里插入图片描述

append和concat方法

在这里插入图片描述
其中ignore_index如果为True,则不会使用之前的索引;如果verify_integrity为True,当出现重复索引时会报出ValueError的异常。

# -*- coding: utf-8 -*-
import pandas as pd

df = pd.DataFrame([[1, 2], [3, 4]], columns=list('AB')) #返回   A B
                                                        #    0 1 2
                                                        #    1 3 4
df2 = pd.DataFrame([[5, 6], [7, 8]], columns=list('AB')) 

df.append(df2)	#返回   A B    默认情况下会保留原来索引
				#    0 1 2
                #    1 3 4
                #    0 5 6
                #    1 7 8

# 如果 ignore_index=True
df.append(df2, ignore_index=True)                  #返回  A B   索引会自动顺延
                                                   #    0 1 2
                                                   #    1 3 4
                                                   #    2 5 6
                                                   #    3 7 8

但是在拼接DataFrame的时候,append方法的效率并不高,官方文档中推荐的方法是concat方法

df = pd.DataFrame(columns=['A'])
pd.concat([pd.DataFrame([i], columns=['A']) for i in range(5)],  ignore_index=True)     
#返回  A
#   0 0
#	1 1
#	2 2
#	3 3
#	4 4

# 上面的concat实例理解为,
df1 = pd.DataFrame([1], columns=['A'])
df2 = pd.DataFrame([2], columns=['A'])
df3 = pd.DataFrame([3], columns=['A'])
df4 = pd.DataFrame([4], columns=['A'])
df5 = pd.DataFrame([5], columns=['A'])
pd.concat([df1,df2,df3,df4,df5])

difference、intersection和 union方法

在这里插入图片描述
在这里插入图片描述

delete和insert方法

两个方法的一般使用格式,

# delete方法
Index.delete(loc)

# insert方法
Index.insert(loc, item)

在这里插入图片描述

drop方法

drop(item)

使用示例,
在这里插入图片描述

is_unique属性

索引值不唯一,但是可能包含不同的数据,此时操作起Series和Dataframe时,就需要注意错删的情况。
在这里插入图片描述
在这里插入图片描述

索引对象操作进阶

在实际的使用中,对于索引对象的操作远不止上面列出的那些,

重索引 reindex

使用的是reindex方法,这个方法很重要,创建的是一个使用新索引的新对象,reindex方法对于Series和DataFrame都适用。以官方文档中DataFrame的介绍为例,
在这里插入图片描述

# -*- coding: utf-8 -*-
import pandas as pd

index = ['Firefox', 'Chrome', 'Safari', 'IE10', 'Konqueror']
df = pd.DataFrame({ 'http_status': [200,200,404,404,301],
                    'response_time': [0.04, 0.02, 0.07, 0.08, 1.0]},    
                    index=index)
# 得到	 	http_status     response_time
#	Firefox     200            0.04
#	Chrome   	200            0.02
#	Safari      404            0.07
#	IE10        404            0.08
#	Konqueror   301            1.00

new_index= ['Safari', 'Iceweasel', 'Comodo Dragon', 'IE10', 'Chrome']
df.reindex(new_index)                         
#返回            http_status      response_time
#		Safari   404.0                0.07
#    Iceweasel   NaN                  NaN
#Comodo Dragon   NaN                  NaN
#		  IE10   404.0                0.08
#		Chrome   200.0                0.02
# 会保留之前存在的索引,之前不存在的索引会使用缺失值进行替代

# 对缺失值进行填补可配合适用 fill_value方法,fill_value可以是任意类型的值
df.reindex(new_index, fill_value=0)  
#返回            http_status      response_time
#		Safari   404.0                0.07
#    Iceweasel   0                    0
#Comodo Dragon   0                    0
#		  IE10   404.0                0.08
#		Chrome   200.0                0.02

date_index = pd.date_range('1/1/2010', periods=6, freq='D')
df2 = pd.DataFrame({"prices": [100, 101, np.nan, 100, 89, 88]}, index=date_index) 
# 返回       prices
# 2010-01-01  100
# 2010-01-02  101
# 2010-01-03  NaN
# 2010-01-04  100
# 2010-01-05   89
# 2010-01-06   88
date_index2 = pd.date_range('12/29/2009', periods=10, freq='D')
df2.reindex(date_index2)
# 返回        prices
# 2009-12-29  NaN
# 2009-12-30  NaN
# 2009-12-31  NaN
# 2010-01-01  100
# 2010-01-02  101
# 2010-01-03  NaN
# 2010-01-04  100
# 2010-01-05   89
# 2010-01-06   88
df2.reindex(date_index2, method='bfill')
# 返回        prices
# 2009-12-29  100
# 2009-12-30  100
# 2009-12-31  100
# 2010-01-01  100
# 2010-01-02  101
# 2010-01-03  100
# 2010-01-04  100
# 2010-01-05   89
# 2010-01-06   88

# 使用columns参数则是替换之前的列名,
df.reindex(columns=['http_status', 'user_agent'])
#返回            http_status        user_agent
#		Safari   404.0                0.07
#    Iceweasel   0                    0
#Comodo Dragon   0                    0
#		  IE10   404.0                0.08
#		Chrome   200.0                0.02
#如果不使用上面的方式,可以通过axis参数传入 index或columns来指定替换行索引还是列索引
df.reindex(['http_status', 'user_agent'], axis="columns")    #结果与上方相同

上面的演示中,除了用指定的值填补缺失值,method参数给出了几个选项,

default: don’t fill gaps
pad / ffill: propagate last valid observation forward to next valid,用前放实测值填补
backfill / bfill: use next valid observation to fill gap,后方的实测值填补
nearest: use nearest valid observations to fill gap,最近的实测值填补

上面的操作都是针对整个DataFrame的索引进行的,pandas模块也同样支持对部分索引进行操作,需要与ix属性配合使用,
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
之前不存在的列会使用缺失值进行填补。

Series和DataFrame的索引操作

Series索引

Series的一系列操作较为简单,因为Series的结构可以看做是一个一维数组,
在这里插入图片描述
Series使用索引对象进行切片,与平时编程语言的切片是不同的,包含头,也包含尾
在这里插入图片描述
在这里插入图片描述

DataFrame索引

DataFrame的索引操作比较复杂,因为有行索引和列索引,
在这里插入图片描述
DataFrame的切片操作也涉及到两个维度,
在这里插入图片描述
117行代码是选取three这列大于5的全部的行。

通过索引定位(loc、iloc和ix、xs方法)

对上面的三种方法进行区分,首先参考官方文档的说明,
在这里插入图片描述

方法名说明
loc通过行标签索引行数据
iloc通过行号索引行数据
ix通过行标签或者行号索引行数据(基于loc和iloc 的混合),ix是最为常用的。
xs选取单行或单列

四个方法中,xs方法由于涉及到行列操作,所以对其进行特别说明,
在这里插入图片描述

#现在有个DataFrame df
#	   A      B      C
#  a   4      5      2
#  b   4      0      9
#  c   9      7      3
df.xs('a')                
# 返回 A 4    axis=0取回的是指定的行
#	  B 5
#     C 2
#	  Name: a
df.xs('C', axis=1)   
# 返回 a 2    axis=1取回的是指定的列
#     b 9
#	  c 3
#	  Name: C

索引排序(sort_index方法)

使用的是sort_index方法,该方法返回的是已排序的新对象,
在这里插入图片描述

Series索引排序

Series索引排序,方式很简单,因为只有一个维度,
在这里插入图片描述

DataFrame索引排序

Dataframe索引排序涉及到两个维度,可以使用axis参数进行指定,

axis参数值排序对象
axis=0行索引排序
axis=1列索引排序

在这里插入图片描述
sort_index方法默认是升序排列,如果需要降序,可以指定 asending参数为False。
在这里插入图片描述

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值