一、用处
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-01 | 2019-10-02 | 2019-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
| 收盘 | 开盘 | 高 | 低 | 交易量 | 涨跌幅 | ||
|---|---|---|---|---|---|---|---|
| 公司 | 日期 | ||||||
| BIDU | 2019-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 | |
| BABA | 2019-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 | |
| IQ | 2019-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 | |
| JD | 2019-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=['公司', '日期'])