重新排序Pandas多级索引数据框架

5

我希望重新排列数据框中的列,并保持正确的列值。

例如,这是我所拥有的数据框

cols = [ ['Three', 'Two'],['A', 'D', 'C', 'B']]
header = pd.MultiIndex.from_product(cols)
df = pd.DataFrame([[1,4,3,2,5,8,7,6]]*4,index=np.arange(1,5),columns=header)                  
df.loc[:,('One','E')] = 9
df.loc[:,('One','F')] = 10

>>> df

我想将它更改如下:

header2 = pd.MultiIndex(levels=[['One', 'Two', 'Three'], ['E', 'F', 'A', 'B', 'C', 'D']],
       labels=[[0, 0, 0, 0, 1, 1, 1, 1, 2, 2], [0, 1, 2, 3, 4, 5, 2, 3, 4, 5]])

df2 = pd.DataFrame([[9,10,1,2,3,4,5,6,7,8]]*4,index=np.arange(1,5), columns=header2)
>>>>df2

请将下面的DataFrame语法转换为可以在这里显示的语法。 - Jelmerd
1
你在第一个和第二个数据框中的MultiIndex不同... 你到底想做什么? - cs95
基本上我正在尝试重新排序列,将顶部标题更改为“一”,“二”,“三”,并且对于“二”和“三”标题,重新排序底部标题为“A”,“B”,“C”,“D”。 - Jelmerd
你能解释一下为什么最终的排序是“一 二 三”,而不是“一 三 二”吗? - user3483203
这只是一个例子,重点是我正在寻找一种将列按任意特定顺序排列的方法(不一定是按字母顺序)。 - Jelmerd
1个回答

5

首先,对顶层进行分类排序。然后,在第一轴上同时使用两个级别调用sort_index

v = pd.Categorical(df.columns.get_level_values(0), 
                   categories=['One', 'Two', 'Three'], 
                   ordered=True)
v2 = pd.Categorical(df.columns.get_level_values(1), 
                    categories=['E', 'F', 'C', 'B', 'A', 'D'],
                    ordered=True)
df.columns = pd.MultiIndex.from_arrays([v, v2]) 

df = df.sort_index(axis=1, level=[0, 1])

df
  One     Two          Three         
    E   F   C  B  A  D     C  B  A  D
1   9  10   7  6  5  8     3  2  1  4
2   9  10   7  6  5  8     3  2  1  4
3   9  10   7  6  5  8     3  2  1  4
4   9  10   7  6  5  8     3  2  1  4

谢谢,但是顶部标题现在的顺序不正确(One,Three,Two),我猜这在底部标题上起作用,因为在这个示例中所需的顺序是按字母顺序排列的,但我正在寻找一种可以按任何所需顺序完成此操作的解决方案。 - Jelmerd
@Jelmerd 这是按字典顺序排序的。我已经编辑了我的答案,包含你想要的内容。你也可以用同样的方法处理第二层级别。 - cs95
谢谢,虽然我还不太清楚如何对底层进行排序,比如说我想让底层按照 E F C B A D C B A D 的顺序排列,我能否传递一个包含这个顺序的列表来实现底层排序? - Jelmerd
@Jelmerd 没问题,如果答案有帮助的话,您也可以点赞。谢谢! - cs95

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接