Pandas的分层索引Multilndex 2021-08-24


''' 为什么要学习分层索引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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值