??多級(jí)索引:在一個(gè)軸上有多個(gè)(兩個(gè)以上)的索引,能夠以低維度形式來(lái)表示高維度的數(shù)據(jù)。單級(jí)索引是Index對(duì)象,多級(jí)索引是MultiIndex對(duì)象。
一、創(chuàng)建多級(jí)索引
- 方法一:隱式創(chuàng)建,即給DataFrame的
index或columns參數(shù)傳遞兩個(gè)或更多的數(shù)組。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) # 創(chuàng)建多級(jí) 列 索引 ------------------------------------------------------------------------------------- English Chinese like dislike like dislike girl 85 109 117 110 boy 85 111 100 107 - 方法二、顯示創(chuàng)建,推薦使用較簡(jiǎn)單的
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) # 創(chuàng)建多級(jí) 行 索引 ------------------------------------------------------------------------------------- girl boy English like 92 98 dislike 118 99 Chinese like 109 108 dislike 108 91
二、檢索多級(jí)索引
- 類似單級(jí)索引檢索(loc、iloc),以
df1數(shù)據(jù)為例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 - 多級(jí)索引的檢索,可以使用更高級(jí)的方法,如xs、IndexSlice等,用到較少暫不介紹。
三、更改索引的層級(jí)
- 創(chuàng)建多級(jí)索引
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 - 為多級(jí)索引命名
df.columns.names = ['Language', 'Pass'] # 設(shè)置列索引名 df.index.names = ['Class', 'Six'] # 設(shè)置行索引名 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 - 更改索引的層級(jí)(swaplevel)
df.swaplevel('Six','Class') # 更改行索引的層級(jí) ------------------------------------------------------------------------------------- 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
四、多級(jí)索引的值排序(sort_index)
- 方法一
df.sort_index(level=0, axis=0, ascending=False) # 對(duì)行索引Class的值進(jìn)行降序排列 ------------------------------------------------------------------------------------- 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版本開始,已經(jīng)被棄用
五、多級(jí)索引匯總統(tǒng)計(jì)
- 示例一
df.sum(level=1) 或df.sum(level='Six') # 對(duì)行索引Six進(jìn)行求和 ------------------------------------------------------------------------------------- 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) # 對(duì)列索引Language進(jìn)行求和 ------------------------------------------------------------------------------------- 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
六、多級(jí)索引軸向轉(zhuǎn)換
-
常見的數(shù)據(jù)層次化結(jié)構(gòu):樹狀和表格
- 軸向轉(zhuǎn)換的函數(shù)
-
stack(): 將行索引變成列索引,可以理解為將表格數(shù)據(jù)轉(zhuǎn)換為樹狀數(shù)據(jù) -
unstack(): 將列索引變成行索引,可以理解為將樹狀數(shù)據(jù)轉(zhuǎn)換為表格數(shù)據(jù) - 兩個(gè)函數(shù)互為逆函數(shù),作用相反,用法相同。單級(jí)索引時(shí),結(jié)果會(huì)生成一個(gè)Series;多級(jí)索引時(shí)默認(rèn)轉(zhuǎn)換最內(nèi)層索引,也可以自定義轉(zhuǎn)換的索引層級(jí)
-
- 示例
print(df) # 數(shù)據(jù)源 ------------------------------------------------------------------------------------- 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() # 默認(rèn)將最內(nèi)層的行索引(Pass)轉(zhuǎn)換為了列索引 ------------------------------------------------------------------------------------- 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)轉(zhuǎn)化成行索引 ------------------------------------------------------------------------------------- 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
七、多級(jí)索引轉(zhuǎn)換單級(jí)索引
- 步驟:先將多級(jí)的行索引轉(zhuǎn)換為列索引,再重置列索引
- 示例
dt = df.stack() # 將內(nèi)層行索引()轉(zhuǎn)換為列索引 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

