Pandas進(jìn)階之DataFrame多級(jí)索引

??多級(jí)索引:在一個(gè)軸上有多個(gè)(兩個(gè)以上)的索引,能夠以低維度形式來(lái)表示高維度的數(shù)據(jù)。單級(jí)索引是Index對(duì)象,多級(jí)索引是MultiIndex對(duì)象。

一、創(chuàng)建多級(jí)索引

  • 方法一:隱式創(chuàng)建,即給DataFrame的indexcolumns參數(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í)

  1. 創(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
    
  2. 為多級(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
    
  3. 更改索引的層級(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ù)
    1. stack() : 將行索引變成列索引,可以理解為將表格數(shù)據(jù)轉(zhuǎn)換為樹狀數(shù)據(jù)
    2. unstack() : 將列索引變成行索引,可以理解為將樹狀數(shù)據(jù)轉(zhuǎn)換為表格數(shù)據(jù)
    3. 兩個(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
    
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 寧夏佳寶 和她相識(shí)在漂流瓶,那是個(gè)于我無(wú)所事事的下午于她也是如此!她在漂流瓶上說(shuō)了林肯公園的一首歌名好奇的回了一句...
    還是個(gè)小鄧子閱讀 262評(píng)論 16 0
  • Xcode真機(jī)支持組件. 每次升級(jí)Xcode可能隱含一些坑, 所以很多Developer可能還在使用舊版本的Xco...
    sasky2008閱讀 771評(píng)論 0 0
  • 夢(mèng)行者 2018.1.9 最近發(fā)覺表達(dá)能力的強(qiáng)弱與寫作能力息息相關(guān),一個(gè)人寫作能力強(qiáng),那他的表達(dá)能力差不...
    UP夢(mèng)行者閱讀 237評(píng)論 0 0
  • 今天公司來(lái)了2位總部老師就安排一起吃晚餐,晚餐老師的構(gòu)成主要是各部門主管和我一個(gè)教學(xué)老師,當(dāng)時(shí)叫到我時(shí)很驚訝。到了...
    文文的花期閱讀 290評(píng)論 0 1
  • 八十九、福至心靈 消災(zāi)免難 道升 筆者共修的一位蓮友陳龍舟居士,家住臺(tái)北縣中和市,早晚以駕駛幼兒園娃娃車為業(yè)。為人...
    謙與默閱讀 431評(píng)論 0 0

友情鏈接更多精彩內(nèi)容