3. 分组后去除多级索引

  1. # 读取数据
  2. In[13]: flights = pd.read_csv('data/flights.csv')
  3. flights.head()
  4. Out[13]:

3. 分组后去除多级索引 - 图1

  1. # 按'AIRLINE', 'WEEKDAY'分组,分别对DIST和ARR_DELAY聚合
  2. In[14]: airline_info = flights.groupby(['AIRLINE', 'WEEKDAY'])\
  3. .agg({'DIST':['sum', 'mean'],
  4. 'ARR_DELAY':['min', 'max']}).astype(int)
  5. airline_info.head()
  6. Out[14]:

3. 分组后去除多级索引 - 图2

  1. # 行和列都有两级索引,get_level_values(0)取出第一级索引
  2. In[15]: level0 = airline_info.columns.get_level_values(0)
  3. level0
  4. Out[15]: Index(['DIST', 'DIST', 'ARR_DELAY', 'ARR_DELAY'], dtype='object')
  1. # get_level_values(1)取出第二级索引
  2. In[16]: level1 = airline_info.columns.get_level_values(1)
  3. level1
  4. Out[16]: Index(['sum', 'mean', 'min', 'max'], dtype='object')
  1. # 一级和二级索引拼接成新的列索引
  2. In[17]: airline_info.columns = level0 + '_' + level1
  3. In[18]: airline_info.head(7)
  4. Out[18]:

3. 分组后去除多级索引 - 图3

  1. # reset_index()可以将行索引变成单级
  2. In[19]: airline_info.reset_index().head(7)
  3. Out[19]:

3. 分组后去除多级索引 - 图4

更多

  1. # Pandas默认会在分组运算后,将所有分组的列放在索引中,as_index设为False可以避免这么做。分组后使用reset_index,也可以达到同样的效果
  2. In[20]: flights.groupby(['AIRLINE'], as_index=False)['DIST'].agg('mean').round(0)
  3. Out[20]:

3. 分组后去除多级索引 - 图5

  1. # 上面这么做,会默认对AIRLINE排序,sort设为False可以避免排序
  2. In[21]: flights.groupby(['AIRLINE'], as_index=False, sort=False)['DIST'].agg('mean')
  3. Out[21]:

3. 分组后去除多级索引 - 图6