Pandas進階之DataFrame多級索引

多級索引:在一個軸上有多個(兩個以上)的索引,可以以低維度形式來表示高維度的數據。單級索引是Index對象,多級索引是MultiIndex對象。php

1、建立多級索引

  • 方法一:隱式建立,即給DataFrame的indexcolumns參數傳遞兩個或更多的數組。
    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
  • 方法2、顯示建立,推薦使用較簡單的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

2、檢索多級索引

  • 相似單級索引檢索(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等,用到較少暫不介紹。

3、更改索引的層級

  1. 建立多級索引
    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
  2. 爲多級索引命名
    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 
  3. 更改索引的層級(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 

4、多級索引的值排序(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版本開始,已經被棄用

5、多級索引彙總統計

  • 示例一
    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 

6、多級索引軸向轉換

  • 常見的數據層次化結構:樹狀和表格css


     
     
  • 軸向轉換的函數
    1. stack() : 將行索引變成列索引,能夠理解爲將表格數據轉換爲樹狀數據
    2. unstack() : 將列索引變成行索引,能夠理解爲將樹狀數據轉換爲表格數據
    3. 兩個函數互爲逆函數,做用相反,用法相同。單級索引時,結果會生成一個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

7、多級索引轉換單級索引

  • 步驟:先將多級的行索引轉換爲列索引,再重置列索引
  • 示例
    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 
相關文章
相關標籤/搜索