- 分层索引:在一个轴向上拥有多个索引层级,可能表达现高准维度数据的形式
- 可以更方便的进行数据筛选,如果有序,则性能更好
- groupby等操作结果,如果是多key, 结果是分层索引,需要会使用
- 一般不需要自己创建分层索引(MultiIndex有构造函数但一般不用)
- Series的分层索引MultiIndex
- Series有多层索引筛选数据
- DataFrame的多层索引MultiIndex
- DataFrame有多层索引筛选数据
import pandas as pd
file_path = r'C:\TELCEL_MEXICO_BOT\A\互联网公司股票.xlsx'
stocks = pd.read_excel(file_path)
print(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 1169.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 128.80 28.11 28.97 27.82 8.77 -0.03
10 2019-10-02 JD 128.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
print(stocks.shape)
(12, 8)
print(stocks['公司'].unique())
['BIDU' 'BABA' 'IQ' 'JD']
print(stocks.index)
RangeIndex(start=0, stop=12, step=1)
print(stocks.groupby('公司')['收盘'].mean())
公司
BABA 500.133333
BIDU 102.980000
IQ 15.900000
JD 95.016667
Name: 收盘, dtype: float64
一, Series的分层索引MultiIndex
print(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 1169.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 128.80 28.11 28.97 27.82 8.77 -0.03
10 2019-10-02 JD 128.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
ser = stocks.groupby(['公司','日期'])['收盘'].mean()
print(ser)
公司 日期
BABA 2019-10-01 165.15
2019-10-02 165.77
2019-10-03 1169.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 128.06
2019-10-03 128.80
Name: 收盘, dtype: float64
## 注意 多维索引中,空白的意思是:使用上面的值
print(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把二级索引变成列, 下面就成了一个DataFrame
print(ser.unstack())
日期 2019-10-01 2019-10-02 2019-10-03
公司
BABA 165.15 165.77 1169.48
BIDU 102.00 102.62 104.32
IQ 15.92 15.72 16.06
JD 28.19 128.06 128.80
print(ser)
公司 日期
BABA 2019-10-01 165.15
2019-10-02 165.77
2019-10-03 1169.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 128.06
2019-10-03 128.80
Name: 收盘, dtype: float64
print(ser.reset_index())
公司 日期 收盘
0 BABA 2019-10-01 165.15
1 BABA 2019-10-02 165.77
2 BABA 2019-10-03 1169.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 128.06
11 JD 2019-10-03 128.80
二,Series有多层索引MultiIndex进行筛选数据
print(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 1169.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 128.80 28.11 28.97 27.82 8.77 -0.03
10 2019-10-02 JD 128.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
ser = stocks.groupby(['公司','日期'])['收盘'].mean()
print(ser)
公司 日期
BABA 2019-10-01 165.15
2019-10-02 165.77
2019-10-03 1169.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 128.06
2019-10-03 128.80
Name: 收盘, dtype: float64
print(ser.loc['BIDU'])
日期
2019-10-01 102.00
2019-10-02 102.62
2019-10-03 104.32
Name: 收盘, dtype: float64
print(ser.loc['BIDU', '2019-10-02'])
102.62
print(ser.loc[:, '2019-10-02':'2019-10-05'])
公司 日期
BABA 2019-10-02 165.77
2019-10-03 1169.48
BIDU 2019-10-02 102.62
2019-10-03 104.32
IQ 2019-10-02 15.72
2019-10-03 16.06
JD 2019-10-02 128.06
2019-10-03 128.80
Name: 收盘, dtype: float64
print(ser.loc[:, '2019-10-02'])
BABA 165.77
BIDU 102.62
IQ 15.72
JD 128.06
Name: 收盘, dtype: float64
三,DataFrame的多层索引MultiIndex
print(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 1169.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 128.80 28.11 28.97 27.82 8.77 -0.03
10 2019-10-02 JD 128.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.set_index(['公司','日期'], inplace=True)
print(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 1169.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 128.80 28.11 28.97 27.82 8.77 -0.03
2019-10-02 128.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
print(stocks.sort_index(inplace=True))
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=['公司', '日期'])
None
print(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 1169.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 128.06 28.00 28.22 27.53 9.53 0.00
2019-10-03 128.80 28.11 28.97 27.82 8.77 -0.03
四, DataFrame有多层索引MultiIndex筛选数据
在选择数据时
元组(key1,key2)代表筛选多层索引,其中key1是索引第一级,kew2二是第二级,比如keg1=JD,key2=2019-0-02
列表(key2)代表同一层的多个key, 只中key1和key2是并列的同级索引,比如key1=JD,key2=BIDU
import pandas as pd
file_path = r'C:\TELCEL_MEXICO_BOT\A\互联网公司股票.xlsx'
stocks = pd.read_excel(file_path)
print(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 1169.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 128.80 28.11 28.97 27.82 8.77 -0.03
10 2019-10-02 JD 128.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
# 筛选 BIDU 数据
stocks.set_index(['公司','日期'], inplace=True)
print( stocks.loc['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
## 筛选BIDU 2019-10-02的数据
stocks.set_index(['公司','日期'], inplace=True)
print( stocks.loc[('BIDU','2019-10-02'),:])
收盘 102.62
开盘 100.85
高 103.24
低 99.50
交易量 2.69
涨跌幅 0.01
Name: (BIDU, 2019-10-02 00:00:00), dtype: float64
## 筛选BIDU 2019-10-02的 开盘 数据
stocks.set_index(['公司','日期'], inplace=True)
print( stocks.loc[('BIDU','2019-10-02'),'开盘'])
100.85
## 筛选 BIDU,JD 数据
stocks.set_index(['公司','日期'], inplace=True)
print( stocks.loc[['BIDU','JD'], :])
公司 日期
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
JD 2019-10-03 128.80 28.11 28.97 27.82 8.77 -0.03
2019-10-02 128.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
## 筛选 BIDU,JD 在2019-10-03数据
stocks.set_index(['公司','日期'], inplace=True)
print(stocks.loc[(['BIDU','JD'],'2019-10-03'), :])
收盘 开盘 高 低 交易量 涨跌幅
公司 日期
BIDU 2019-10-03 104.32 102.35 104.73 101.15 2.24 0.02
JD 2019-10-03 128.80 28.11 28.97 27.82 8.77 -0.03
## 筛选 BIDU,JD 在2019-10-03收盘数据
stocks.set_index(['公司','日期'], inplace=True)
print(stocks.loc[(['BIDU','JD'],'2019-10-03'), '收盘'])
公司 日期
BIDU 2019-10-03 104.32
JD 2019-10-03 128.80
Name: 收盘, dtype: float64
## 筛选BIDU 2019-10-02至2019-10-03收盘数据
stocks.set_index(['公司','日期'], inplace=True)
print(stocks.loc[('BIDU',['2019-10-02','2019-10-03']), '收盘'])
公司 日期
BIDU 2019-10-02 102.62
2019-10-03 104.32
Name: 收盘, dtype: float64
## 筛选2019-10-02至2019-10-03所有的数据
stocks.set_index(['公司','日期'], inplace=True)
print(stocks.loc[(slice(None),['2019-10-02','2019-10-03']), :])
公司 日期
BIDU 2019-10-02 102.62 100.85 103.24 99.50 2.69 0.01
BABA 2019-10-02 165.77 162.82 166.88 161.90 11.60 0.00
IQ 2019-10-02 15.72 15.85 15.87 15.12 8.10 -0.01
JD 2019-10-02 128.06 28.00 28.22 27.53 9.53 0.00
BIDU 2019-10-03 104.32 102.35 104.73 101.15 2.24 0.02
BABA 2019-10-03 1169.48 166.65 170.18 165.00 10.39 0.02
IQ 2019-10-03 16.06 15.71 16.38 15.32 10.08 0.02
JD 2019-10-03 128.80 28.11 28.97 27.82 8.77 -0.03
##采用reset_index把多维索引变成普通的列
stocks.set_index(['公司','日期'], inplace=True)
print(stocks.reset_index())
公司 日期 收盘 开盘 高 低 交易量 涨跌幅
0 BIDU 2019-10-03 104.32 102.35 104.73 101.15 2.24 0.02
1 BIDU 2019-10-02 102.62 100.85 103.24 99.50 2.69 0.01
2 BIDU 2019-10-01 102.00 102.80 103.26 101.00 1.78 -0.01
3 BABA 2019-10-03 1169.48 166.65 170.18 165.00 10.39 0.02
4 BABA 2019-10-02 165.77 162.82 166.88 161.90 11.60 0.00
5 BABA 2019-10-01 165.15 168.01 168.23 163.64 14.19 -0.01
6 IQ 2019-10-03 16.06 15.71 16.38 15.32 10.08 0.02
7 IQ 2019-10-02 15.72 15.85 15.87 15.12 8.10 -0.01
8 IQ 2019-10-01 15.92 16.14 16.22 15.50 11.65 -0.01
9 JD 2019-10-03 128.80 28.11 28.97 27.82 8.77 -0.03
10 JD 2019-10-02 128.06 28.00 28.22 27.53 9.53 0.00
11 JD 2019-10-01 28.19 28.22 28.57 27.97 10.64 0.00
DataFrame多层索引总结:
如果想筛选多级,就用元祖括起来,每个元素代表一级索引,元素可是以单个值,也可以是列表,是列表时,相当于并列筛选某个值
1198

被折叠的 条评论
为什么被折叠?



