1. 程式人生 > 實用技巧 >3-Pandas層次化索引&拼接

3-Pandas層次化索引&拼接

Pandas層次化索引

  • 建立多層索引

    • 隱式構造

      • 最常見的方法是給DataFrame建構函式的index引數傳遞兩個或更多的陣列

      • df = DataFrame(
            data=np.random.randint(0,100,size=(6,6)),
            index=[['一班','一班','一班','二班','二班','二班'],['張三','李四','王五','趙六','田七','孫八']],
            columns=[['期中','期中','期中','期末','期末','期末'],['語文','數學','英語','政治','歷史','地理']]
        )
        
    • 顯式構造

      • 使用陣列

        • df = DataFrame(
              data=np.random.randint(0,100,size=(6,6)),
              index=pd.MultiIndex.from_arrays([['一班','一班','一班','二班','二班','二班'],['張三','李四','王五','趙六','田七','孫八']]),
              columns=[['期中','期中','期中','期末','期末','期末'],['語文','數學','英語','政治','歷史','地理']]
          )
          
      • 使用tuple

        • df = DataFrame(
              data=np.random.randint(0,100,size=(6,6)),
              index=pd.MultiIndex.from_tuples(
                  (
                      ('一班','張三'),('一班','李四'),('一班','王五'),
                      ('二班','趙六'),('二班','田七'),('二班','孫八'),
                  )
              ),
              columns=[['期中','期中','期中','期末','期末','期末'],['語文','數學','英語','政治','歷史','地理']]
          )
          
      • 使用product

        • df = DataFrame(
              data=np.random.randint(0,100,size=(6,6)),
              # 笛卡爾積
              index=pd.MultiIndex.from_product([['一班','二班'],['張三','李四','王五']]),
              columns=pd.MultiIndex.from_product([['期中','期末'],['語文','數學','英語']])
          )
          
    • Series也可以建立多層次索引

      • index=[['一班','一班','一班','二班','二班','二班'],['張三','李四','王五','趙六','田七','孫八']]
        s=Series(data=np.random.randint(0,100,size=6),index=index)
        
    • 多層列索引

      • 除了行索引index,列索引columns也能用同樣的方法建立多層索引
    • 多層索引物件的索引與切片操作

      • Series的操作
        • 對於Series來說,直接中括號[]與使用.loc[]完全一樣,推薦使用.loc中括號索引和切片
        • 索引
          • 顯式索引
            • s['一班']['張三']
            • s['一班','李四']
            • s.loc['一班','李四']
            • s[['一班','二班']]
              • 最外層索引依然保留
            • s.loc[['一班','二班']]
          • 隱式索引
            • s[1]
            • s.iloc[4]
            • s[[2,4]]
              • 最外層索引依然保留
            • s.iloc[[2,4]]
        • 切片
          • 隱式切片
            • s[1:5]
            • s.iloc[1:5]
            • 建議使用隱式切片
              • 直接對最內層索引切片
          • 顯示切片
            • 預設只能對外層索引切片
            • s['一班':'二班']
      • DataFrame的操作
        • 索引
          • 可以直接使用列名稱來進行列索引
          • 使用索引:優先考慮列索引
            • df['期末']
            • df['期末']['英語']
            • df['期末','英語']
            • df[('期末','英語')]
              • 建議使用
            • df.期末.英語
            • df[('期末','英語')][2]
          • 行索引(必須加loc或iloc)
            • df.loc[('一班','王五'),('期末','英語')]
              • 建議使用
        • 切片
          • 建議使用隱式切片
          • 預設行切片
            • df[1:4]
            • df.iloc[1:4]
            • df['一班':'二班']
            • df.loc['一班':'二班']
            • df[('一班','張三')