多級索引:在一個軸上有多個(兩個以上)的索引,可以以低維度形式來表示高維度的數據。單級索引是Index對象,多級索引是MultiIndex對象。php
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
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
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
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
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
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
常見的數據層次化結構:樹狀和表格css
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