天天看點

資料分析工具Pandas(5):Pandas的層級索引

資料分析工具Pandas(1):Pandas的資料結構

資料分析工具Pandas(2):Pandas的索引操作

資料分析工具Pandas(3):Pandas的對齊運算

資料分析工具Pandas(4):Pandas的函數應用

資料分析工具Pandas(5):Pandas的層級索引

層級索引(hierarchical indexing)

下面建立一個Series, 在輸入索引Index時,輸入了由兩個子list組成的list,第一個子list是外層索引,第二個list是内層索引。

import pandas as pd
import numpy as np
 
ser_obj = pd.Series(np.random.randn(12),index=[
                ['a', 'a', 'a', 'b', 'b', 'b', 'c', 'c', 'c', 'd', 'd', 'd'],
                [0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2]
            ])
print(ser_obj)      

運作結果:

a  0    0.099174
   1   -0.310414
   2   -0.558047
b  0    1.742445
   1    1.152924
   2   -0.725332
c  0   -0.150638
   1    0.251660
   2    0.063387
d  0    1.080605
   1    0.567547
   2   -0.154148
dtype: float64      

MultiIndex索引對象

  • 列印這個Series的索引類型,顯示是MultiIndex
  • 直接将索引列印出來,可以看到有lavels,和labels兩個資訊。lavels表示兩個層級中分别有那些标簽,labels是每個位置分别是什麼标簽。
print(type(ser_obj.index))
print(ser_obj.index)      
<class 'pandas.indexes.multi.MultiIndex'>
MultiIndex(levels=[['a', 'b', 'c', 'd'], [0, 1, 2]],
           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]])<class 'pandas.indexes.multi.MultiIndex'>
MultiIndex(levels=[['a', 'b', 'c', 'd'], [0, 1, 2]],
           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]])      

選取子集

根據索引擷取資料。因為現在有兩層索引,當通過外層索引擷取資料的時候,可以直接利用外層索引的标簽來擷取。

當要通過内層索引擷取資料的時候,在list中傳入兩個元素,前者是表示要選取的外層索引,後者表示要選取的内層索引。

1. 外層選取:

ser_obj['outer_label']

# 外層選取
print(ser_obj['c'])      
0   -1.362096
1    1.558091
2   -0.452313
dtype: float64      

2. 内層選取:

ser_obj[:, 'inner_label']
# 内層選取
print(ser_obj[:, 2])      
a    0.826662
b    0.015426
c   -0.452313
d   -0.051063
dtype: float64      

常用于分組操作、透視表的生成等

交換分層順序

1. swaplevel()

.swaplevel( )交換内層與外層索引。
print(ser_obj.swaplevel())
      
0  a    0.099174
1  a   -0.310414
2  a   -0.558047
0  b    1.742445
1  b    1.152924
2  b   -0.725332
0  c   -0.150638
1  c    0.251660
2  c    0.063387
0  d    1.080605
1  d    0.567547
2  d   -0.154148
dtype: float64      

交換并排序分層

sortlevel()

.sortlevel( )先對外層索引進行排序,再對内層索引進行排序,預設是升序。
# 交換并排序分層
print(ser_obj.swaplevel().sortlevel())      
0  a    0.099174
   b    1.742445
   c   -0.150638
   d    1.080605
1  a   -0.310414
   b    1.152924
   c    0.251660
   d    0.567547
2  a   -0.558047
   b   -0.725332
   c    0.063387
   d   -0.154148
dtype: float64