多級索引:在一個軸上有多個(兩個以上)的索引,能夠以低維度形式來表示高維度的數據。單級索引是Index對象,多級索引是MultiIndex對象。
一、創建多級索引
- 方法一:隱式創建,即給DataFrame的
index
或columns
參數傳遞兩個或更多的數組。df1 = pd.DataFrame(np.random.randint(80, 120, size=(2, 4)), index= ['girl', 'boy'], columns=[['English', 'English', 'Chinese', 'Chinese'], ['like', 'dislike', 'like', 'dislike']]) print(df1) # 創建多級 列 索引 ------------------------------------------------------------------------------------- English Chinese like dislike like dislike girl 85 109 117 110 boy 85 111 100 107
- 方法二、顯示創建,推薦使用較簡單的
pd.MultiIndex.from_product
方法df2 = pd.DataFrame(np.random.randint(80, 120, size=(4, 2)), columns= ['girl', 'boy'], index=pd.MultiIndex.from_product([['English','Chinese'], ['like','dislike']])) print(df2) # 創建多級 行 索引 ------------------------------------------------------------------------------------- girl boy English like 92 98 dislike 118 99 Chinese like 109 108 dislike 108 91
二、檢索多級索引
- 類似單級索引檢索(loc、iloc),以
df1
數據為例df1.English ------------------------------------------------------------------------------------- like dislike girl 105 112 boy 118 87 df1.English.dislike ------------------------------------------------------------------------------------- girl 112 boy 87 Name: dislike, dtype: int64 df1.iloc[:,0:3] ------------------------------------------------------------------------------------- English Chinese like dislike like girl 85 113 82 boy 97 83 94 df1.loc['girl', ['English', 'Chinese']] ------------------------------------------------------------------------------------- English like 105 dislike 112 Chinese like 87 dislike 92 Name: girl, dtype: int64
- 多級索引的檢索,可以使用更高級的方法,如xs、IndexSlice等,用到較少暫不介紹。
三、更改索引的層級
- 創建多級索引
df = pd.DataFrame(np.random.randint(80, 120, size=(6, 4)), index= pd.MultiIndex.from_product([[1, 2, 3],['girl', 'boy']]), columns=pd.MultiIndex.from_product([['English','Chinese'], ['Y','N']])) print(df) ------------------------------------------------------------------------------------- English Chinese Y N Y N 1 girl 86 99 111 105 boy 85 110 113 112 2 girl 98 106 108 94 boy 117 80 97 83 3 girl 95 81 114 95 boy 106 95 119 81
- 為多級索引命名
df.columns.names = ['Language', 'Pass'] # 設置列索引名 df.index.names = ['Class', 'Six'] # 設置行索引名 print(df) ------------------------------------------------------------------------------------- Language English Chinese Pass Y N Y N Class Six 1 girl 86 99 111 105 boy 85 110 113 112 2 girl 98 106 108 94 boy 117 80 97 83 3 girl 95 81 114 95 boy 106 95 119 81
- 更改索引的層級(swaplevel)
df.swaplevel('Six','Class') # 更改行索引的層級 ------------------------------------------------------------------------------------- Language English Chinese Pass Y N Y N Six Class girl 1 86 99 111 105 boy 1 85 110 113 112 girl 2 98 106 108 94 boy 2 117 80 97 83 girl 3 95 81 114 95 boy 3 106 95 119 81
四、多級索引的值排序(sort_index)
- 方法一
df.sort_index(level=0, axis=0, ascending=False) # 對行索引Class的值進行降序排列 ------------------------------------------------------------------------------------- Language English Chinese Pass Y N Y N Class Six 3 girl 95 81 114 95 boy 106 95 119 81 2 girl 98 106 108 94 boy 117 80 97 83 1 girl 86 99 111 105 boy 85 110 113 112
- 方法二:使用sortlevel方法,從0.20.0版本開始,已經被棄用
五、多級索引匯總統計
- 示例一
df.sum(level=1) 或df.sum(level='Six') # 對行索引Six進行求和 ------------------------------------------------------------------------------------- Language English Chinese Pass Y N Y N Six girl 279 286 333 294 boy 308 285 329 276
- 示例二
df.sum(level=0, axis=1) 或 df.sum(level='Language', axis=1) # 對列索引Language進行求和 ------------------------------------------------------------------------------------- Language English Chinese Class Six 1 girl 185 216 boy 195 225 2 girl 204 202 boy 197 180 3 girl 176 209 boy 201 200
六、多級索引軸向轉換
-
常見的數據層次化結構:樹狀和表格
- 軸向轉換的函數
stack()
: 將行索引變成列索引,可以理解為將表格數據轉換為樹狀數據unstack()
: 將列索引變成行索引,可以理解為將樹狀數據轉換為表格數據- 兩個函數互為逆函數,作用相反,用法相同。單級索引時,結果會生成一個Series;多級索引時默認轉換最內層索引,也可以自定義轉換的索引層級
- 示例
print(df) # 數據源 ------------------------------------------------------------------------------------- Language English Chinese Pass Y N Y N Class Six 1 girl 86 99 111 105 boy 85 110 113 112 2 girl 98 106 108 94 boy 117 80 97 83 3 girl 95 81 114 95 boy 106 95 119 81 df.stack() # 默認將最內層的行索引(Pass)轉換為了列索引 ------------------------------------------------------------------------------------- Language Chinese English Class Six Pass 1 girl N 105 99 Y 111 86 boy N 112 110 Y 113 85 2 girl N 94 106 Y 108 98 boy N 83 80 Y 97 117 3 girl N 95 81 Y 114 95 boy N 81 95 Y 119 106 df.unstack(level=0) # 指定將列索引(Class)轉化成行索引 ------------------------------------------------------------------------------------- Language English Chinese Pass Y N Y N Class 1 2 3 1 2 3 1 2 3 1 2 3 Six boy 85 117 106 110 80 95 113 97 119 112 83 81 girl 86 98 95 99 106 81 111 108 114 105 94 95
七、多級索引轉換單級索引
- 步驟:先將多級的行索引轉換為列索引,再重置列索引
- 示例
dt = df.stack() # 將內層行索引()轉換為列索引 dt = dt.reset_index() # 重置列索引 print(dt) ------------------------------------------------------------------------------------- Language Class Six Pass Chinese English 0 1 girl N 105 99 1 1 girl Y 111 86 2 1 boy N 112 110 3 1 boy Y 113 85 4 2 girl N 94 106 5 2 girl Y 108 98 6 2 boy N 83 80 7 2 boy Y 97 117 8 3 girl N 95 81 9 3 girl Y 114 95 10 3 boy N 81 95 11 3 boy Y 119 106