6. 用分组聚合实现透视表

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

6. 用分组聚合实现透视表 - 图1

  1. # 用pivot_table方法求出每条航线每个始发地的被取消的航班总数
  2. In[41]: fp = flights.pivot_table(index='AIRLINE',
  3. columns='ORG_AIR',
  4. values='CANCELLED',
  5. aggfunc='sum',
  6. fill_value=0).round(2)
  7. fp.head()
  8. out[41]:

6. 用分组聚合实现透视表 - 图2

  1. # groupby聚合不能直接复现这张表。需要先按所有index和columns的列聚合
  2. In[42]: fg = flights.groupby(['AIRLINE', 'ORG_AIR'])['CANCELLED'].sum()
  3. fg.head()
  4. out[42]: AIRLINE ORG_AIR
  5. AA ATL 3
  6. DEN 4
  7. DFW 86
  8. IAH 3
  9. LAS 3
  10. Name: CANCELLED, dtype: int64
  1. # 再使用unstack,将ORG_AIR这层索引作为列名
  2. In[43]: fg_unstack = fg.unstack('ORG_AIR', fill_value=0)
  3. fg_unstack.head()
  4. out[43]:

6. 用分组聚合实现透视表 - 图3

  1. # 判断两个方式是否等价
  2. In[44]: fg_unstack = fg.unstack('ORG_AIR', fill_value=0)
  3. fp.equals(fg_unstack)
  4. out[44]: True

更多

  1. # 先实现一个稍微复杂的透视表
  2. In[45]: fp2 = flights.pivot_table(index=['AIRLINE', 'MONTH'],
  3. columns=['ORG_AIR', 'CANCELLED'],
  4. values=['DEP_DELAY', 'DIST'],
  5. aggfunc=[np.mean, np.sum],
  6. fill_value=0)
  7. fp2.head()
  8. out[45]:

6. 用分组聚合实现透视表 - 图4

  1. # 用groupby和unstack复现上面的方法
  2. In[46]: flights.groupby(['AIRLINE', 'MONTH', 'ORG_AIR', 'CANCELLED'])['DEP_DELAY', 'DIST'] \
  3. .agg(['mean', 'sum']) \
  4. .unstack(['ORG_AIR', 'CANCELLED'], fill_value=0) \
  5. .swaplevel(0, 1, axis='columns') \
  6. .head()
  7. out[46]:

6. 用分组聚合实现透视表 - 图5