4. 反转stacked数据

  1. # 读取college数据集,学校名作为行索引,,只选取本科生的列
  2. In[25]: usecol_func = lambda x: 'UGDS_' in x or x == 'INSTNM'
  3. college = pd.read_csv('data/college.csv',
  4. index_col='INSTNM',
  5. usecols=usecol_func)
  6. college.head()
  7. out[25]:

4. 反转stacked数据 - 图1

  1. # 用stack方法,将所有水平列名,转化为垂直的行索引
  2. In[26]: college_stacked = college.stack()
  3. college_stacked.head(18)
  4. out[26]: INSTNM
  5. Alabama A & M University UGDS_WHITE 0.0333
  6. UGDS_BLACK 0.9353
  7. UGDS_HISP 0.0055
  8. UGDS_ASIAN 0.0019
  9. UGDS_AIAN 0.0024
  10. UGDS_NHPI 0.0019
  11. UGDS_2MOR 0.0000
  12. UGDS_NRA 0.0059
  13. UGDS_UNKN 0.0138
  14. University of Alabama at Birmingham UGDS_WHITE 0.5922
  15. UGDS_BLACK 0.2600
  16. UGDS_HISP 0.0283
  17. UGDS_ASIAN 0.0518
  18. UGDS_AIAN 0.0022
  19. UGDS_NHPI 0.0007
  20. UGDS_2MOR 0.0368
  21. UGDS_NRA 0.0179
  22. UGDS_UNKN 0.0100
  23. dtype: float64
  1. # unstack方法可以将其还原
  2. In[27]: college_stacked.unstack().head()
  3. out[27]:

4. 反转stacked数据 - 图2

  1. # 另一种方式是先用melt,再用pivot。先加载数据,不指定行索引名
  2. In[28]: college2 = pd.read_csv('data/college.csv',
  3. usecols=usecol_func)
  4. college2.head()
  5. out[28]:

4. 反转stacked数据 - 图3

  1. # 使用melt,将所有race列变为一列
  2. In[29]: college_melted = college2.melt(id_vars='INSTNM',
  3. var_name='Race',
  4. value_name='Percentage')
  5. college_melted.head()
  6. out[29]:

4. 反转stacked数据 - 图4

  1. # 用pivot还原
  2. In[30]: melted_inv = college_melted.pivot(index='INSTNM',
  3. columns='Race',
  4. values='Percentage')
  5. melted_inv.head()
  6. out[30]:

4. 反转stacked数据 - 图5

  1. # 用loc同时选取行和列,然后重置索引,可以获得和原先索引顺序一样的DataFrame
  2. In[31]: college2_replication = melted_inv.loc[college2['INSTNM'],
  3. college2.columns[1:]]\
  4. .reset_index()
  5. college2.equals(college2_replication)
  6. out[31]: True

更多

  1. # 使用最外层的行索引做unstack
  2. In[32]: college.stack().unstack(0)
  3. out[32]:

4. 反转stacked数据 - 图6

  1. # 转置DataFrame更简单的方法是transpose()或T
  2. In[33]: college.T
  3. out[33]:

4. 反转stacked数据 - 图7