设置熊猫数据框中的多索引列的顺序

时间:2018-06-28 03:53:08

标签: python pandas dataframe

是否有一种方法可以根据我的个人喜好(例如,按有序列表)对Pandas数据框中的列索引内的特定级别进行重新排序?

In [130]: frame = pd.DataFrame({
     ...: ('TWO','thing1'):[1,2,3,4],
     ...: ('TWO','thing4'):[1,2,3,4],
     ...: ('DARK','thing1'):[0.1,0.2,1,2],
     ...: ('ANTS','thing3'):['a','e','i','o'],
     ...: ('ANTS','thing1'):['a','e','i','o']})

In [131]: frame
Out[131]: 
    ANTS          DARK    TWO       
  thing1 thing3 thing1 thing1 thing4
0      a      a    0.1      1      1
1      e      e    0.2      2      2
2      i      i    1.0      3      3
3      o      o    2.0      4      4

然后,我的列表基于单独生成的列表。需要特别注意的是,我不知道level 0level 1索引标签-它们是变量。

In [132]: sort_list = ['DARK', 'ANTS', 'TWO']

如果我随后尝试在frame = frame[sort_list].reindex(columns=sort_list)的上下文中传递此列表,则出于明显的原因,它将抛出Expected tuple, got strHere是适用于单级索引的解决方案。

我想做的只是在顶层进行排序,而在第二层保持原样。最终的数据帧看起来像这样……

  DARK   ANTS           TWO       
thing1 thing1 thing3 thing1 thing4
   0.1      a      a      1      1
   0.2      e      e      2      2
   1.0      i      i      3      3
   2.0      o      o      4      4

2 个答案:

答案 0 :(得分:4)

您可以使用reindex

frame.reindex(sort_list, level=0, axis=1)
Out[126]: 
    DARK   ANTS           TWO       
  thing1 thing1 thing3 thing1 thing4
0    0.1      a      a      1      1
1    0.2      e      e      2      2
2    1.0      i      i      3      3
3    2.0      o      o      4      4

答案 1 :(得分:2)

选项1

您可以对索引进行排序,然后切片

frame.sort_index(axis=1, level=1)[['DARK', 'ANTS', 'TWO']]

    DARK   ANTS           TWO       
  thing1 thing1 thing3 thing1 thing4
0    0.1      a      a      1      1
1    0.2      e      e      2      2
2    1.0      i      i      3      3
3    2.0      o      o      4      4

选项2

将列的第一级设置为有序的

frame.columns = frame.columns.set_levels(
    pd.CategoricalIndex(
        frame.columns.levels[0],
        ['DARK', 'ANTS', 'TWO'],
        ordered=True
    ), level=0
)

frame.sort_index(axis=1)

    DARK   ANTS           TWO       
  thing1 thing1 thing3 thing1 thing4
0    0.1      a      a      1      1
1    0.2      e      e      2      2
2    1.0      i      i      3      3
3    2.0      o      o      4      4