目录
Pandas中的索引类
RangeIndex
MultiIndex多层索引
pd.MultiIndex.from_arrays()
索引名称设置
pd.MultiIndex.from_tuples()
pd.MultiIndex.from_product()
高维索引的访问方式
显示索引访问方式
显示切片
隐式索引访问方式
隐式切片
逐级访问
Pandas中的索引类
pandas中常用的索引类为
pd.Index
其还有很多子类,包括
RangeIndex : Index implementing a monotonic integer range.
CategoricalIndex : Index of :class:`Categorical` s.
MultiIndex : A multi-level, or hierarchical, Index.
IntervalIndex : An Index of :class:`Interval` s.
DatetimeIndex, TimedeltaIndex, PeriodIndex
Int64Index, UInt64Index, Float64Index
RangeIndex
比较常见的为RangeIndex,其实例化方法较为方便,只需要确定start,stop以及step就可以
三个参数分别代表起点,终点以及步长,
遵从左闭右开的原则[start,stop)
最常见的RangeIndex就是DataFrame和Series中的隐式索引
import numpy as np
import pandas as pdnp.random.seed(0)data1 = pd.DataFrame(data=np.random.randint(0,100,(3,4)))
print(data1)
print(data1.index)
print(data1.columns)data2 = pd.DataFrame(data=np.random.randint(0,100,(3,4)),index = list('abc'),columns = list('ABCD'))
print(data2)
print(data2.index)
print(data2.columns)# 0 1 2 3
# 0 44 47 64 67
# 1 67 9 83 21
# 2 36 87 70 88
# RangeIndex(start=0, stop=3, step=1)
# RangeIndex(start=0, stop=4, step=1)
# A B C D
# a 88 12 58 65
# b 39 87 46 88
# c 81 37 25 77
# Index(['a', 'b', 'c'], dtype='object')
# Index(['A', 'B', 'C', 'D'], dtype='object')
可以看到data1由于未指定索引,所以行,列索引都为隐式索引,类型为RangeIndex,而下面手动指定索引的类型为Index类
MultiIndex多层索引
MultiIndex也为Index的子类,用于多层索引的创建
所谓多层索引,就是无论在行维度,还是列维度都有不只一个维度的索引,常用的创建多维索引的方式如下
pd.MultiIndex.from_arrays()
由名称可见,这是一个由数组或列表对象生成的索引,若要生成二维索引,一般需要使用一个二维列表或数组,每层数组的长度相等并且一一对应,高维索引相同者会被合并
import numpy as np
import pandas as pdnp.random.seed(0)multiindex = pd.MultiIndex.from_arrays([['第一周','第一周','第一周','第一周','第二周','第二周','第二周','第二周'],['早上','上午','下午','晚上','早上','上午','下午','晚上']])data2 = pd.DataFrame(data=np.random.randint(0,100,(3,8)),index = list('abc'),columns = multiindex)
print(data2)
print(data2.index)
print(data2.columns)# 第一周 第二周
# 早上 上午 下午 晚上 早上 上午 下午 晚上
# a 44 47 64 67 67 9 83 21
# b 36 87 70 88 88 12 58 65
# c 39 87 46 88 81 37 25 77
# Index(['a', 'b', 'c'], dtype='object')
# MultiIndex([('第一周', '早上'),
# ('第一周', '上午'),
# ('第一周', '下午'),
# ('第一周', '晚上'),
# ('第二周', '早上'),
# ('第二周', '上午'),
# ('第二周', '下午'),
# ('第二周', '晚上')],
# )
可以看到这里在行维度上生成的索引有两层,分别为第一周,第二周以及早上,上午,下午,晚上,这里由于有两个第一周和两个第二周连续存在,进行了合并
索引名称设置
索引名称的设置会在索引的行首或列首进行名称的显示
import numpy as np
import pandas as pdnp.random.seed(0)multiindex = pd.MultiIndex.from_arrays([['第一周','第一周','第一周','第一周','第二周','第二周','第二周','第二周'],['早上','上午','下午','晚上','早上','上午','下午','晚上']],names=['周数','时段'])
inde = pd.Index(data = ['tom','jack','nancy'],name = 'Name')data2 = pd.DataFrame(data=np.random.randint(0,100,(3,8)),index = inde,columns = multiindex)
print(data2)
print(data2.index)
print(data2.columns)# 周数 第一周 第二周
# 时段 早上 上午 下午 晚上 早上 上午 下午 晚上
# Name
# tom 44 47 64 67 67 9 83 21
# jack 36 87 70 88 88 12 58 65
# nancy 39 87 46 88 81 37 25 77
# Index(['tom', 'jack', 'nancy'], dtype='object', name='Name')
# MultiIndex([('第一周', '早上'),
# ('第一周', '上午'),
# ('第一周', '下午'),
# ('第一周', '晚上'),
# ('第二周', '早上'),
# ('第二周', '上午'),
# ('第二周', '下午'),
# ('第二周', '晚上')],
# names=['周数', '时段'])
可以看到这里分别设置了列索引的name以及行索引的二级索引的names,需要注意创建多个索引的名称,在实例化的时候要使用names,赋值为包含多个索引名字的列表
pd.MultiIndex.from_tuples()
在上一个由二维列表转为索引的例子中,我们打印输出了行索引的二级索引,输出结果为
MultiIndex([('第一周', '早上'),('第一周', '上午'),('第一周', '下午'),('第一周', '晚上'),('第二周', '早上'),('第二周', '上午'),('第二周', '下午'),('第二周', '晚上')],names=['周数', '时段'])
这里面可以看出,高维索引和低维索引间都是通过一个个元组来组成的,所以自然也会有通过元组来实例化高维索引的方法,pd.MultiIndex.from_tuples()
其实例化的方法也很简单,通过使用一个类似于上面输出的元组列表,第一个元素为高维索引,第二个元素为低维索引
import numpy as np
import pandas as pdnp.random.seed(0)multiindex = pd.MultiIndex.from_tuples([('第一周', '早上'),('第一周', '上午'),('第一周', '下午'),('第一周', '晚上'),('第二周', '早上'),('第二周', '上午'),('第二周', '下午'),('第二周', '晚上')],names=['周数','时段'])
inde = pd.Index(data = ['tom','jack','nancy'],name = 'Name')data2 = pd.DataFrame(data=np.random.randint(0,100,(3,8)),index = inde,columns = multiindex)
print(data2)
print(data2.index)
print(data2.columns)# 周数 第一周 第二周
# 时段 早上 上午 下午 晚上 早上 上午 下午 晚上
# Name
# tom 44 47 64 67 67 9 83 21
# jack 36 87 70 88 88 12 58 65
# nancy 39 87 46 88 81 37 25 77
# Index(['tom', 'jack', 'nancy'], dtype='object', name='Name')
# MultiIndex([('第一周', '早上'),
# ('第一周', '上午'),
# ('第一周', '下午'),
# ('第一周', '晚上'),
# ('第二周', '早上'),
# ('第二周', '上午'),
# ('第二周', '下午'),
# ('第二周', '晚上')],
# names=['周数', '时段'])
pd.MultiIndex.from_product()
这个方法是创建高维所以最为常用的方法,product具有乘积的意思,在这里的用法为同样传入一个二维列表,第一维为高维索引,第二位为低维索引,与from_arrays的区别为,from_product会将每个高维索引与一维索引一一匹配,不需要重复书写高维索引和低维索引
import numpy as np
import pandas as pdnp.random.seed(0)multiindex = pd.MultiIndex.from_product([['第一周','第二周'],['早上','上午','下午','晚上']],names=['周数','时段'])
inde = pd.Index(data = ['tom','jack','nancy'],name = 'Name')data2 = pd.DataFrame(data=np.random.randint(0,100,(3,8)),index = inde,columns = multiindex)
print(data2)
print(data2.index)
print(data2.columns)# 周数 第一周 第二周
# 时段 早上 上午 下午 晚上 早上 上午 下午 晚上
# Name
# tom 44 47 64 67 67 9 83 21
# jack 36 87 70 88 88 12 58 65
# nancy 39 87 46 88 81 37 25 77
# Index(['tom', 'jack', 'nancy'], dtype='object', name='Name')
# MultiIndex([('第一周', '早上'),
# ('第一周', '上午'),
# ('第一周', '下午'),
# ('第一周', '晚上'),
# ('第二周', '早上'),
# ('第二周', '上午'),
# ('第二周', '下午'),
# ('第二周', '晚上')],
# names=['周数', '时段'])
高维索引的访问方式
显示索引访问方式
如果要使用高维索引进行访问,如果要取一行或一列,则使用元组形式(第一个元素为高维索引,第二个元素为低维索引),如果要取多行或多列则使用元组列表,样例如下
import numpy as np
import pandas as pdnp.random.seed(0)multiindex = pd.MultiIndex.from_product([['第一周','第二周'],['早上','上午','下午','晚上']],names=['周数','时段'])
inde = pd.Index(data = ['tom','jack','nancy'],name = 'Name')data2 = pd.DataFrame(data=np.random.randint(0,100,(3,8)),index = inde,columns = multiindex)
print(data2,end = '\n\n')
print(data2[('第一周','早上')],end = '\n\n')
print(data2[[('第二周','早上'),('第二周','晚上')]],end = '\n\n')# 周数 第一周 第二周
# 时段 早上 上午 下午 晚上 早上 上午 下午 晚上
# Name
# tom 44 47 64 67 67 9 83 21
# jack 36 87 70 88 88 12 58 65
# nancy 39 87 46 88 81 37 25 77
#
# Name
# tom 44
# jack 36
# nancy 39
# Name: (第一周, 早上), dtype: int64
#
# 周数 第二周
# 时段 早上 晚上
# Name
# tom 67 21
# jack 88 65
# nancy 81 77
显示切片
显示切片依旧为左闭右闭,需要如果索引为字符串类型,则需要先对DataFrame按字符串索引先排序,
方法为sort_index(),参数axis值为1则沿列方向根据列索引排序,若为0则沿行方向根据行索引排序,默认为0
import numpy as np
import pandas as pdnp.random.seed(0)multiindex = pd.MultiIndex.from_product([['第一周','第二周'],['早上','上午','下午','晚上']],names=['周数','时段'])
inde = pd.Index(data = ['tom','jack','nancy'],name = 'Name')data2 = pd.DataFrame(data=np.random.randint(0,100,(3,8)),index = inde,columns = multiindex)
print(data2,end = '\n\n')
data2.sort_index(axis=1,inplace=True)
print(data2,end = '\n\n')
print(data2.loc[:,('第一周','上午'):('第二周','下午')],end = '\n\n')# 周数 第一周 第二周
# 时段 早上 上午 下午 晚上 早上 上午 下午 晚上
# Name
# tom 44 47 64 67 67 9 83 21
# jack 36 87 70 88 88 12 58 65
# nancy 39 87 46 88 81 37 25 77
#
# 周数 第一周 第二周
# 时段 上午 下午 早上 晚上 上午 下午 早上 晚上
# Name
# tom 47 64 44 67 9 83 67 21
# jack 87 70 36 88 12 58 88 65
# nancy 87 46 39 88 37 25 81 77
#
# 周数 第一周 第二周
# 时段 上午 下午 早上 晚上 上午 下午
# Name
# tom 47 64 44 67 9 83
# jack 87 70 36 88 12 58
# nancy 87 46 39 88 37 25
隐式索引访问方式
隐式索引与一维索引的使用方式相同,不受高维索引的影响
import numpy as np
import pandas as pdnp.random.seed(0)multiindex = pd.MultiIndex.from_product([['第一周','第二周'],['早上','上午','下午','晚上']],names=['周数','时段'])
inde = pd.Index(data = ['tom','jack','nancy'],name = 'Name')data2 = pd.DataFrame(data=np.random.randint(0,100,(3,8)),index = inde,columns = multiindex)
print(data2,end = '\n\n')
print(data2.iloc[:,0],end = '\n\n')
print(data2.iloc[:,[4,7]],end = '\n\n')# 周数 第一周 第二周
# 时段 早上 上午 下午 晚上 早上 上午 下午 晚上
# Name
# tom 44 47 64 67 67 9 83 21
# jack 36 87 70 88 88 12 58 65
# nancy 39 87 46 88 81 37 25 77
#
# Name
# tom 44
# jack 36
# nancy 39
# Name: (第一周, 早上), dtype: int64
#
# 周数 第二周
# 时段 早上 晚上
# Name
# tom 67 21
# jack 88 65
# nancy 81 77
隐式切片
隐式切片为左闭右闭
import numpy as np
import pandas as pdnp.random.seed(0)multiindex = pd.MultiIndex.from_product([['第一周','第二周'],['早上','上午','下午','晚上']],names=['周数','时段'])
inde = pd.Index(data = ['tom','jack','nancy'],name = 'Name')data2 = pd.DataFrame(data=np.random.randint(0,100,(3,8)),index = inde,columns = multiindex)
print(data2,end = '\n\n')
data2.sort_index(axis=1,inplace=True)
print(data2,end = '\n\n')
print(data2.iloc[:,0:6],end = '\n\n')# 周数 第一周 第二周
# 时段 早上 上午 下午 晚上 早上 上午 下午 晚上
# Name
# tom 44 47 64 67 67 9 83 21
# jack 36 87 70 88 88 12 58 65
# nancy 39 87 46 88 81 37 25 77
#
# 周数 第一周 第二周
# 时段 上午 下午 早上 晚上 上午 下午 早上 晚上
# Name
# tom 47 64 44 67 9 83 67 21
# jack 87 70 36 88 12 58 88 65
# nancy 87 46 39 88 37 25 81 77
#
# 周数 第一周 第二周
# 时段 上午 下午 早上 晚上 上午 下午
# Name
# tom 47 64 44 67 9 83
# jack 87 70 36 88 12 58
# nancy 87 46 39 88 37 25
逐级访问
逐级访问可以先访问高级索引,每一个高级索引都对应一个低维的DataFrame,比如这里要访问第一周的上午数据
我们可以调用两次loc访问
import numpy as np
import pandas as pdnp.random.seed(0)multiindex = pd.MultiIndex.from_product([['第一周','第二周'],['早上','上午','下午','晚上']],names=['周数','时段'])
inde = pd.Index(data = ['tom','jack','nancy'],name = 'Name')data2 = pd.DataFrame(data=np.random.randint(0,100,(3,8)),index = inde,columns = multiindex)
print(data2,end = '\n\n')print(data2.loc[:,'第一周'],end = '\n\n')
print(data2.loc[:,'第一周'].loc[:,'上午'])# 周数 第一周 第二周
# 时段 早上 上午 下午 晚上 早上 上午 下午 晚上
# Name
# tom 44 47 64 67 67 9 83 21
# jack 36 87 70 88 88 12 58 65
# nancy 39 87 46 88 81 37 25 77
#
# 时段 早上 上午 下午 晚上
# Name
# tom 44 47 64 67
# jack 36 87 70 88
# nancy 39 87 46 88
#
# Name
# tom 47
# jack 87
# nancy 87
# Name: 上午, dtype: int64