一、用处

1、定义:在一个轴向上拥有多个索引层级,可以表达跟高纬度数据的形式

2、可以更方便的进行数据筛选,如果有序则性能更好

3、groupby等操作的结果,如果多KEY,结果是分层索引,需要使用

4、一般不需要自己创建分层索引

二、series的分层索引

1、读取数据表(百度等公司的三天收盘价)

import pandas as pd
%matplotlib inline
stocks=pd.read_excel('./stocks/互联网公司股票.xlsx')
stocks['公司'].unique()

 2、分层索引

ser=stocks.groupby(['公司','日期'])['收盘'].mean()
公司    日期        
BABA  2019-10-01    165.15            *空白的意思是使用上面的值
      2019-10-02    165.77
      2019-10-03    169.48
BIDU  2019-10-01    102.00
      2019-10-02    102.62
      2019-10-03    104.32
IQ    2019-10-01     15.92
      2019-10-02     15.72
      2019-10-03     16.06
JD    2019-10-01     28.19
      2019-10-02     28.06
      2019-10-03     28.80
Name: 收盘, dtype: float64
ser.index
MultiIndex([('BABA', '2019-10-01'),    *二级分层索引是个列表,列表中的元素是二维元祖
            ('BABA', '2019-10-02'),
            ('BABA', '2019-10-03'),
            ('BIDU', '2019-10-01'),
            ('BIDU', '2019-10-02'),
            ('BIDU', '2019-10-03'),
            (  'IQ', '2019-10-01'),
            (  'IQ', '2019-10-02'),
            (  'IQ', '2019-10-03'),
            (  'JD', '2019-10-01'),
            (  'JD', '2019-10-02'),
            (  'JD', '2019-10-03')],
           names=['公司', '日期'])
#把第二级索引变成列 unstack
ser.unstack()

这个方法相当于把多级索引降级。

还有一种降级方法:.set_index()

日期2019-10-012019-10-022019-10-03
公司   
BABA 165.15 165.77 169.48
BIDU 102.00 102.62 104.32
IQ 15.92 15.72 16.06
JD 28.19 28.06 28.80
3、多层索引筛选
3.1:筛选第一层索引:.loc['索引值']
ser.loc['BIDU']
日期
2019-10-01    102.00
2019-10-02    102.62
2019-10-03    104.32
Name: 收盘, dtype: float64
3.2:筛选2层索引:.loc[(第一层,第二层)]相当于定位到具体值了
ser.loc[('BIDU','2019-10-02')]

3.3:筛选第二层索引:.loc[:,第二层索引]

ser.loc[:,'2019-10-02']
公司
BABA    165.77
BIDU    102.62
IQ       15.72
JD       28.06
Name: 收盘, dtype: 

三、DataFrame的多层索引multiindex
#DataFrame的多层索引
stocks.set_index(['公司','日期'],inplace=True)
stocks
  收盘开盘交易量涨跌幅
公司日期      
BIDU2019-10-03 104.32 102.35 104.73 101.15 2.24 0.02
2019-10-02 102.62 100.85 103.24 99.50 2.69 0.01
2019-10-01 102.00 102.80 103.26 101.00 1.78 -0.01
BABA2019-10-03 169.48 166.65 170.18 165.00 10.39 0.02
2019-10-02 165.77 162.82 166.88 161.90 11.60 0.00
2019-10-01 165.15 168.01 168.23 163.64 14.19 -0.01
IQ2019-10-03 16.06 15.71 16.38 15.32 10.08 0.02
2019-10-02 15.72 15.85 15.87 15.12 8.10 -0.01
2019-10-01 15.92 16.14 16.22 15.50 11.65 -0.01
JD2019-10-03 28.80 28.11 28.97 27.82 8.77 0.03
2019-10-02 28.06 28.00 28.22 27.53 9.53 0.00
2019-10-01 28.19 28.22 28.57 27.97 10.64 0.00

stocks.index
MultiIndex([('BIDU', '2019-10-03'),
            ('BIDU', '2019-10-02'),
            ('BIDU', '2019-10-01'),
            ('BABA', '2019-10-03'),
            ('BABA', '2019-10-02'),
            ('BABA', '2019-10-01'),
            (  'IQ', '2019-10-03'),
            (  'IQ', '2019-10-02'),
            (  'IQ', '2019-10-01'),
            (  'JD', '2019-10-03'),
            (  'JD', '2019-10-02'),
            (  'JD', '2019-10-01')],
           names=['公司', '日期'])