1.创建多层索引
1) 隐式构造
最常见的方法是给DataFrame构造函数的index参数传递两个或更多的数组
- Series也可以创建多层索引
ndex = [[‘一班’,‘一班’,‘一班’,‘二班’,‘二班’,‘二班’,],[‘张三’,‘李四’,‘王五’,‘赵六’,‘田七’,‘孙八’]]
data = np.random.randint(80,150,size=(6,))
s = pd.Series(data=data,index=index)
s
index = [['一班','一班','一班','二班','二班','二班',],['张三','李四','王五','赵六','田七','孙八']]
columns=[['其中','其中','其中','期末','期末','期末'],
['语文','数学','英语','语文','数学','英语']]
data=np.random.randint(80,150,size=(6,6))
df = pd.DataFrame(data=data,index=index,columns=columns)
df
1) 显示构造pd.MultiIndex
- 使用数组
index = pd.MultiIndex.from_arrays([['一班','一班','一班','二班','二班','二班',],['张三','李四','王五','赵六','田七','孙八']])
columns = pd.MultiIndex.from_arrays([['其中','其中','其中','期末','期末','期末'],['语文','数学','英语','语文','数学','英语']])
data = np.random.randint(80,150,size=(6,6))
df = pd.DataFrame(index=index,columns=columns,data=data)
df
- 使用tuple
columns = pd.MultiIndex.from_tuples((('期中','语文'),('期中','数学'),('期中','英语'),
('期末','语文'),('期末','数学'),('期末','英语')))
index = pd.MultiIndex.from_arrays([['一班','一班','一班','二班','二班','二班',],['张三','李四','王五','赵六','田七','孙八']])
data = np.random.randint(80,150,size=(6,6))
df = pd.DataFrame(index=index,columns=columns,data=data)
df
- 使用product
columns=pd.MultiIndex.from_product([['期中','期末'],['语文','数学','英语']])
index = pd.MultiIndex.from_arrays([['一班','一班','一班','二班','二班','二班',],['张三','李四','王五','赵六','田七','孙八']])
data = np.random.randint(80,150,size=(6,6))
df = pd.DataFrame(index=index,columns=columns,data=data)
df
2.多层索引对象的索引与切片操作
1) Series的操作
【重要】对于Series来说,直接中括号[]与使用.loc()完全一样,推荐使用中括号索引和切片。
(1) 索引
多层索引的索引和切片的原则: 不能直接索引内层索引.
s[('一班','张三')]
(2)切片
#会报错 UnsortedIndexError Traceback (most recent call last)
s.loc[('一班','张三'):('二班','赵六')]
s.iloc[0:4]
1) DataFrame的操作
(1) 可以直接使用列名称来进行列索引
- 列多级索引的索引和切片操作
df[('期中','语文')]
df.iloc[:,0:4]
- 行多级索引的索引和切片操作
# 显示索引
df.loc[('一班','张三'),:]
df.iloc[0,:]
(2) 使用行索引需要用loc()函数
【极其重要】推荐使用loc()函数
注意在对行索引的时候,若一级行索引还有多个,对二级行索引会遇到问题!也就是说,无法直接对二级索引进行索引,必须让二级索引变成一级索引后才能对其进行索引!
3.索引的堆(stack)
其实就是行列索引之间的转化.
stack就是放列索引变成行索引
原来的df
df.stack()
df.unstack(fill_value=0)
df.stack(level=0).unstack(level=(0,1))
5.聚合操作
【注意】
-
需要指定axis
-
【小技巧】和unstack()相反,聚合的时候,axis等于哪一个,哪一个就保留。
-
先确定要聚合的方向,聚合行还是聚合列
-
确定在聚合的方向上,要留下的哪层索引,level等于哪一层
# 1.计算各个科目期中期末平均成绩
df.mean(axis=1,level=1)
# 2计算各科目张三李四的最高分
df.max(axis=1,level=1)