Pandas的分层索引MultiIndex

  1. 分层索引:在一个轴向上拥有多个索引层级,可能表达现高准维度数据的形式
  2. 可以更方便的进行数据筛选,如果有序,则性能更好
  3. groupby等操作结果,如果是多key, 结果是分层索引,需要会使用
  4. 一般不需要自己创建分层索引(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多层索引总结:

如果想筛选多级,就用元祖括起来,每个元素代表一级索引,元素可是以单个值,也可以是列表,是列表时,相当于并列筛选某个值

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值