Pandas中的多重索引排序

109

我有一个带有多级索引的 Pandas 数据框,我想根据特定列中的值对其进行排序。我的数据集如下:

    Group1    Group2
    A B C     A B C
1   1 0 3     2 5 7
2   5 6 9     1 0 0
3   7 0 2     0 3 5 

我想按照Group 1列中的C值,将所有数据和索引降序排序,使我的结果如下:

   Group1    Group2
   A B C     A B C
2  5 6 9     1 0 0
1  1 0 3     2 5 7
3  7 0 2     0 3 5 

使用我现有数据的结构,是否可能进行此排序操作?或者应该将 Group1 转移到索引侧边进行操作?

2个回答

166
在按MultiIndex排序时,您需要将描述列的元组包含在列表中*:
In [11]: df.sort_values([('Group1', 'C')], ascending=False)
Out[11]: 
  Group1       Group2      
       A  B  C      A  B  C
2      5  6  9      1  0  0
1      1  0  3      2  5  7
3      7  0  2      0  3  5

为了避免混淆pandas认为你想先按Group1排序,再按C排序。
注意:原本使用 .sort,但自0.20版本起被弃用并删除,建议使用.sort_values

0
  1. 你可以通过索引列来进行排序(例如按照第三列等)。此外,你不需要使用方括号,因此可以使用元组来索引列。

    # 按照第三列降序排序
    df.sort_values(('Group1', 'C'), ascending=False)
    
    df.sort_values(df.columns[2], ascending=False)   # 与上述代码相同
    

    res1

  2. 如果你想按照多个列进行排序,则可以使用元组的列表(或直接索引列)。也可以将一个列表传递给 ascending 参数,以选择是否对该列进行升序排序。

    # 按照 (Group1, B) 降序排序和 (Group1, A) 升序排序
    df.sort_values(by=[('Group1', 'B'), ('Group1', 'A')], ascending=[False, True])
    
    df.sort_values(df.columns[[1, 0]].tolist(), ascending=[False, True])
    

    res2

  3. 如果你想要对一个多级索引的数据框进行排序,可以使用 sort_index。例如,如果你想按照第二级降序排序并按照第一级升序排序:

    # 通过名称选择级别
    df.sort_index(level=['Name', 'Groups'], ascending=[True, False])
    
    # 通过索引选择级别(即使索引没有名称也可以使用)
    df.sort_index(level=[1, 0], ascending=[True, False])
    

    res3


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