Python 设置数据帧中多索引列的顺序

Python 设置数据帧中多索引列的顺序,python,pandas,dataframe,Python,Pandas,Dataframe,是否有一种方法可以根据我的个人偏好(例如,通过有序列表)对Pandas数据框中的columns索引中的特定级别进行重新排序 然后,我的列表基于单独生成的列表。重要的是要注意,我不知道0级或1级索引标签-它们是变量 In [132]: sort_list = ['DARK', 'ANTS', 'TWO'] 如果我随后尝试在frame=frame[sort\u list]或的上下文中传递此列表,则reindex(columns=sort\u list)会抛出预期的元组,因为明显的原因会得到str。

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

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

In [132]: sort_list = ['DARK', 'ANTS', 'TWO']
如果我随后尝试在
frame=frame[sort\u list]
的上下文中传递此列表,则reindex(columns=sort\u list)
会抛出
预期的元组,因为明显的原因会得到str
。是在单个级别索引上工作的解决方案

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

  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

您可以使用
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 您可以对索引排序,然后切片

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

我差点就吃到了谢谢@piRSquared,另一个以前未知的方法…:-)我不认为我今天没有看到新的东西。
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