''' 为什么要学习分层索引Multilndex? ·分层索引:在一个轴向上拥有多个索引层级,可以表达更高维度数据的形式; ·可以更方便的进行数据筛选,如果有序则性能更好;
groupby等操作的结果,如果是多KEY,结果是分层索引,需要会使用 ·一般不需要自己创建分层索引(Multilndex有构造函数但一般不用) 演示数据:百度、阿里巴巴、爱奇艺、京东四家公司的10天股票数据 数据来自:英为财经 https://cn.investing.coml 本次演示提纲: 一、Series的分层索引|Multilndex 二、Series有多层索引怎样筛选数据? 三、DataFrame的多层索引Multilndex 四、DataFrame有多层索引怎样筛选数据? '''
import pandas as pd
stocks
fpath = "F:\\python387\\pandas\\data\\stock.xlsx"
stocks = pd.read_excel(fpath)
stocks
日期 公司 收盘 开盘 高 低 交易量 涨跌幅
0 2019-10-03 BIDU 104.32 102.35 104.73 101.15 2.24 0.02
1 2019-10-02 BIDU 102.62 100.85 103.24 99.50 2.69 0.01
2 2019-10-01 BIDU 102.00 102.80 103.26 101.00 1.78 -0.01
3 2019-10-03 BABA 169.48 166.65 170.18 165.00 10.39 0.02
4 2019-10-02 BABA 165.77 162.82 166.88 161.90 11.60 0.00
5 2019-10-01 BABA 165.15 168.01 168.23 163.64 14.19 -0.01
6 2019-10-03 IQ 16.06 15.71 16.38 15.32 10.08 0.02
7 2019-10-02 IQ 15.72 15.85 15.87 15.12 8.10 -0.01
8 2019-10-01 IQ 15.92 16.14 16.22 15.50 11.65 -0.01
9 2019-10-03 JD 28.80 28.11 28.97 27.82 8.77 0.03
10 2019-10-02 JD 28.06 28.00 28.22 27.53 9.53 0.00
11 2019-10-01 JD 28.19 28.22 28.57 27.97 10.64 0.00
stocks.shape
(12, 8)
stocks['公司'].unique()
array(['BIDU', 'BABA', 'IQ', 'JD'], dtype=object)
ks.index
stocks.index
RangeIndex(start=0, stop=12, step=1)
b
stocks.groupby('公司')['收盘'].mean()
公司
BABA 166.80
BIDU 102.98
IQ 15.90
JD 28.35
Name: 收盘, dtype: float64
一、Series的分层所有MultiIndex
ser =stocks.groupby(['公司','日期'])['收盘'].mean()
ser
公司 日期
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
ser.index
MultiIndex(levels=[['BABA', 'BIDU', 'IQ', 'JD'], ['2019-10-01', '2019-10-02', '2019-10-03']],
labels=[[0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3], [0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2]],
names=['公司', '日期'])
ser.unstack()
#unstack把二级索引变成列
日期 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
ser
ser.reset_index()
公司 日期 收盘
0 BABA 2019-10-01 165.15
1 BABA 2019-10-02 165.77
2 BABA 2019-10-03 169.48
3 BIDU 2019-10-01 102.00
4 BIDU 2019-10-02 102.62
5 BIDU 2019-10-03 104.32
6 IQ 2019-10-01 15.92
7 IQ 2019-10-02 15.72
8 IQ 2019-10-03 16.06
9 JD 2019-10-01 28.19
10 JD 2019-10-02 28.06
11 JD 2019-10-03 28.80
二、Series 有多层索引MultiIndex
ser
ser
公司 日期
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.loc['BIDU']
日期
2019-10-01 102.00
2019-10-02 102.62
2019-10-03 104.32
Name: 收盘, dtype: float64
#多层索引,可以用元组的形式筛选
ser.loc['BIDU','2019-10-02']
102.62
2019-10-02
ser.loc[:,'2019-10-02']
公司
BABA 165.77
BIDU 102.62
IQ 15.72
JD 28.06
Name: 收盘, dtype: float64
三、DataFrame的多层索引Multilndex
stocks.head()
日期 公司 收盘 开盘 高 低 交易量 涨跌幅
0 2019-10-03 BIDU 104.32 102.35 104.73 101.15 2.24 0.02
1 2019-10-02 BIDU 102.62 100.85 103.24 99.50 2.69 0.01
2 2019-10-01 BIDU 102.00 102.80 103.26 101.00 1.78 -0.01
3 2019-10-03 BABA 169.48 166.65 170.18 165.00 10.39 0.02
4 2019-10-02 BABA 165.77 162.82 166.88 161.90 11.60 0.00
,
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(levels=[['BABA', 'BIDU', 'IQ', 'JD'], ['2019-10-01', '2019-10-02', '2019-10-03']],
labels=[[1, 1, 1, 0, 0, 0, 2, 2, 2, 3, 3, 3], [2, 1, 0, 2, 1, 0, 2, 1, 0, 2, 1, 0]],
names=['公司', '日期'])
stocks
stocks.sort_index(inplace = True)
stocks
收盘 开盘 高 低 交易量 涨跌幅
公司 日期
BABA 2019-10-01 165.15 168.01 168.23 163.64 14.19 -0.01
2019-10-02 165.77 162.82 166.88 161.90 11.60 0.00
2019-10-03 169.48 166.65 170.18 165.00 10.39 0.02
BIDU 2019-10-01 102.00 102.80 103.26 101.00 1.78 -0.01
2019-10-02 102.62 100.85 103.24 99.50 2.69 0.01
2019-10-03 104.32 102.35 104.73 101.15 2.24 0.02
IQ 2019-10-01 15.92 16.14 16.22 15.50 11.65 -0.01
2019-10-02 15.72 15.85 15.87 15.12 8.10 -0.01
2019-10-03 16.06 15.71 16.38 15.32 10.08 0.02
JD 2019-10-01 28.19 28.22 28.57 27.97 10.64 0.00
2019-10-02 28.06 28.00 28.22 27.53 9.53 0.00
2019-10-03 28.80 28.11 28.97 27.82 8.77 0.03
四、DataFrame有多层索引Multilndex怎样筛选数据
【重要知识】在选择数据时:
1.元组(key1,key2)代表筛选多层索引,其中key1是索引第一级,key2是第二级,比如key1=JD,key2=2019-10-2
2.列表[key1,key2]表示同一层的多个key,其中key1和key2是并列的同级索引,比如key1 = JD,key2 = BIDU
BIDU
stocks.loc['BIDU']
收盘 开盘 高 低 交易量 涨跌幅
日期
2019-10-01 102.00 102.80 103.26 101.00 1.78 -0.01
2019-10-02 102.62 100.85 103.24 99.50 2.69 0.01
2019-10-03 104.32 102.35 104.73 101.15 2.24 0.02
stocks.loc[('BIDU','2019-10-02'),:]
stocks.loc[('BIDU','2019-10-02'),:]
收盘 102.62
开盘 100.85
高 103.24
低 99.50
交易量 2.69
涨跌幅 0.01
Name: (BIDU, 2019-10-02), dtype: float64
'开盘'
stocks.loc[('BIDU','2019-10-02'),'开盘']
100.84999999999999
stocks.loc[['BIDU','JD'],:]
stocks.loc[['BIDU','JD'],:]
收盘 开盘 高 低 交易量 涨跌幅
公司 日期
BIDU 2019-10-01 102.00 102.80 103.26 101.00 1.78 -0.01
2019-10-02 102.62 100.85 103.24 99.50 2.69 0.01
2019-10-03 104.32 102.35 104.73 101.15 2.24 0.02
JD 2019-10-01 28.19 28.22 28.57 27.97 10.64 0.00
2019-10-02 28.06 28.00 28.22 27.53 9.53 0.00
2019-10-03 28.80 28.11 28.97 27.82 8.77 0.03
stocks.loc[(['BIDU','JD'],'2019-10-02'),:]
stocks.loc[(['BIDU','JD'],'2019-10-02'),:]
收盘 开盘 高 低 交易量 涨跌幅
公司 日期
BIDU 2019-10-02 102.62 100.85 103.24 99.50 2.69 0.01
JD 2019-10-02 28.06 28.00 28.22 27.53 9.53 0.00
'2019-10-02'
stocks.loc[(['BIDU','JD'],'2019-10-02'),'开盘']
公司 日期
BIDU 2019-10-02 100.85
JD 2019-10-02 28.00
Name: 开盘, dtype: float64
'2019-10-02','2019-10-03'
stocks.loc[('BIDU',['2019-10-02','2019-10-03']),'开盘']
公司 日期
BIDU 2019-10-02 100.85
2019-10-03 102.35
Name: 开盘, dtype: float64
stocks.reset_index()
公司 日期 收盘 开盘 高 低 交易量 涨跌幅
0 BABA 2019-10-01 165.15 168.01 168.23 163.64 14.19 -0.01
1 BABA 2019-10-02 165.77 162.82 166.88 161.90 11.60 0.00
2 BABA 2019-10-03 169.48 166.65 170.18 165.00 10.39 0.02
3 BIDU 2019-10-01 102.00 102.80 103.26 101.00 1.78 -0.01
4 BIDU 2019-10-02 102.62 100.85 103.24 99.50 2.69 0.01
5 BIDU 2019-10-03 104.32 102.35 104.73 101.15 2.24 0.02
6 IQ 2019-10-01 15.92 16.14 16.22 15.50 11.65 -0.01
7 IQ 2019-10-02 15.72 15.85 15.87 15.12 8.10 -0.01
8 IQ 2019-10-03 16.06 15.71 16.38 15.32 10.08 0.02
9 JD 2019-10-01 28.19 28.22 28.57 27.97 10.64 0.00
10 JD 2019-10-02 28.06 28.00 28.22 27.53 9.53 0.00
11 JD 2019-10-03 28.80 28.11 28.97 27.82 8.77 0.03
,:
#slice(None)代表筛选这一索引的所有内容
stocks.loc[(slice(None),['2019-10-02','2019-10-03']),:]
收盘 开盘 高 低 交易量 涨跌幅
公司 日期
BABA 2019-10-02 165.77 162.82 166.88 161.90 11.60 0.00
2019-10-03 169.48 166.65 170.18 165.00 10.39 0.02
BIDU 2019-10-02 102.62 100.85 103.24 99.50 2.69 0.01
2019-10-03 104.32 102.35 104.73 101.15 2.24 0.02
IQ 2019-10-02 15.72 15.85 15.87 15.12 8.10 -0.01
2019-10-03 16.06 15.71 16.38 15.32 10.08 0.02
JD 2019-10-02 28.06 28.00 28.22 27.53 9.53 0.00
2019-10-03 28.80 28.11 28.97 27.82 8.77 0.03