4.7 pandas的索引处理
In [1]:
#引入相关模块 import numpy as np # pandas和numpy常常结合在一起使用,导入numpy库 import pandas as pd # 导入pandas库 print(pd.__version__) # 打印pandas版本信息
1.4.1
4.7.1 多层索引MultiIndex的创建方式
层次化索引(hierarchical indexing)又称多层索引,是pandas的一项重要功能,在一个轴上拥有多个(两个以上)索引级别,使用户能以低维度形式处理高维度数据。创建多层索引的方式有如下几种:
- 在创建Series或DataFrame时,可以通过给index(columns)参数传递嵌套列表(类似于多维数组),进而构建多维索引。每个元素(一维数组)指定每个层级的索引。
In [2]:
df1 = pd.DataFrame(np.random.randint(2,20,size=(4, 8)), index=[["2020", "2020", "2021", "2021"], ["上半年", "下半年", "上半年", "下半年"]], columns=[["水果", "水果","水果","水果", "蔬菜", "蔬菜","蔬菜","蔬菜"], ["苹果",'西瓜', "香蕉", "桔子","黄瓜","茄子", "胡萝卜","辣椒"]]) df1
Out[2]:
水果 | 蔬菜 | ||||||||
---|---|---|---|---|---|---|---|---|---|
苹果 | 西瓜 | 香蕉 | 桔子 | 黄瓜 | 茄子 | 胡萝卜 | 辣椒 | ||
2020 | 上半年 | 13 | 9 | 15 | 9 | 13 | 15 | 7 | 8 |
下半年 | 9 | 8 | 2 | 9 | 13 | 13 | 8 | 9 | |
2021 | 上半年 | 7 | 4 | 3 | 6 | 11 | 13 | 18 | 15 |
下半年 | 8 | 6 | 11 | 16 | 14 | 5 | 9 | 4 |
多层索引的索引属性:
In [3]:
df1.index
Out[3]:
MultiIndex([('2020', '上半年'), ('2020', '下半年'), ('2021', '上半年'), ('2021', '下半年')], )
In [4]:
df1.columns
Out[4]:
MultiIndex([('水果', '苹果'), ('水果', '西瓜'), ('水果', '香蕉'), ('水果', '桔子'), ('蔬菜', '黄瓜'), ('蔬菜', '茄子'), ('蔬菜', '胡萝卜'), ('蔬菜', '辣椒')], )
可以发现,多层索引的一个索引元素是元组而不是单层索引的标量。这里的df1对应着四维数组:两层行索引+两层列索引,在进行索引切片操作时同样满足numpy的索引切片操作的维度变化规律。
MultiIndex多层索引有个属性level,表示第几层索引,最外层为第0层索引,依次往内,对应1,2...层索引。可以通过下标获取对应层级索引:
In [5]:
df1.columns.levels[0]
Out[5]:
Index(['水果', '蔬菜'], dtype='object')
In [6]:
df1.columns.levels[1]
Out[6]:
Index(['桔子', '胡萝卜', '苹果', '茄子', '西瓜', '辣椒', '香蕉', '黄瓜'], dtype='object')
In [7]:
df1.index.levels[0]
Out[7]:
Index(['2020', '2021'], dtype='object')
In [8]:
df1.index.levels[1]
Out[8]:
Index(['上半年', '下半年'], dtype='object')
对于多层索引,也可以设置索引的名称,此时,设置名称的属性为names(通过一维数组来设置)。每层索引都具有名称
In [9]:
df1.index.names = ["年份", "半年"] df1.columns.names = ["大类", "小类"] df1
Out[9]:
大类 | 水果 | 蔬菜 | |||||||
---|---|---|---|---|---|---|---|---|---|
小类 | 苹果 | 西瓜 | 香蕉 | 桔子 | 黄瓜 | 茄子 | 胡萝卜 | 辣椒 | |
年份 | 半年 | ||||||||
2020 | 上半年 | 13 | 9 | 15 | 9 | 13 | 15 | 7 | 8 |
下半年 | 9 | 8 | 2 | 9 | 13 | 13 | 8 | 9 | |
2021 | 上半年 | 7 | 4 | 3 | 6 | 11 | 13 | 18 | 15 |
下半年 | 8 | 6 | 11 | 16 | 14 | 5 | 9 | 4 |
- 通过MultiIndex类的from_arrays或from_tuples方法,预先创建MultiIndex对象,作为Series与DataFrame中的index(或columns)参数值。
- from_arrays:接收一个多维数组参数,高维指定高层索引,低维指定底层索引。
- from_tuples:接收一个元组的列表,每个元组指定每个索引(高维索引,低维索引)。
In [10]:
# from_arrays 参数为一个二维数组,每个元素(一维数组)分别为每层索引的内容。 mindex_arrsys = pd.MultiIndex.from_arrays([["2020", "2020", "2021", "2021"], ["上半年", "下半年", "上半年", "下半年"]]) df2 = pd.DataFrame(np.random.randint(2,20,size=(4, 6)), index=mindex_arrsys)#作为行索引 df2
Out[10]:
0 | 1 | 2 | 3 | 4 | 5 |
---|