【问题标题】:Python Pandas sorting multiindex by column, but retain tree structurePython Pandas 按列排序多索引,但保留树结构
【发布时间】:2018-05-02 20:29:28
【问题描述】:

使用 pandas 0.20.3 我正在尝试按具有值(降序)的列 ('D') 对数据帧的 n 个多级进行排序,以便保持组的层次结构。

示例输入:

                    D
A     B     C
Gran1 Par1  Child1  3
            Child2  7
            Child3  2
      Par2  Child1  9
            Child2  2
      Par3  Child1  6
Gran2 Par1  Child1  3
      Par2  Child1  8
            Child2  2
            Child3  3
      Par3  Child1  6
            Child2  8

想要的结果:

                    D
A     B     C
Gran2 Par3  Child2  8
            Child1  6
      Par2  Child1  8
            Child3  3
            Child2  2
      Par1  Child1  3
Gran1 Par1  Child2  7
            Child1  3
            Child3  2
      Par2  Child1  9
            Child2  2
      Par3  Child1  6

与排序和排序多级索引相关的其他问题的解决方案似乎集中在对索引的实际级别进行排序或在对列进行排序时保持其顺序。我没有找到多级排序,其中列的值用于按该特定级别的聚合值对索引进行排序。非常感谢任何建议。

【问题讨论】:

    标签: python pandas sorting tree multi-index


    【解决方案1】:

    对于来自MultiIndex 的列需要reset_index,然后对于sum 值需要transform,然后是sort_values,最后是set_index

    df = df.reset_index()
    df['G'] = df.groupby(['A','B'])['D'].transform('sum')
    
    df = df.sort_values(['A','G','D'], ascending=False).drop('G',1).set_index(['A','B','C'])
    print (df)
    
                       D
    A     B    C        
    Gran2 Par3 Child2  8
               Child1  6
          Par2 Child1  8
               Child3  3
               Child2  2
          Par1 Child1  3
    Gran1 Par1 Child2  7
               Child1  3
               Child3  2
          Par2 Child1  9
               Child2  2
          Par3 Child1  6
    

    【讨论】:

    • 谢谢!快速,但仍然不是我寻求的解决方案......请注意,例如在 Gran1 中,par 1 中的总和大于 Par3 中的总和,因此应该更高。所以应该按照从A到C的顺序进行排序。希望解释是有道理的......
    • 它似乎适用于我的真实数据集...您确定您的解决方案中的输出正确吗?它似乎与您的解决方案不符。我会尝试看看是否可以将其扩展到更多级别。谢谢!
    • 实际上,它还不起作用......它似乎在我的数据集中的第二个 col 上排序,但在其他 col 上没有排序......同时检查不同的输出与所需的结果
    • 谢谢!我想我必须为我的支持而努力。
    • 我担心我提供的示例不是很好。您的解决方案适用于它,但它不适用于我更大的数据集。我对 A 有更多的值,但这些仍然搞砸了......在这里对 A 进行排序的理由是什么,因为 sort 现在不在该特定级别的“组加载”?
    【解决方案2】:

    您需要创建三个单独的数组并按所有数组的组合进行排序。在此示例中,我使用 Numpy 的 np.lexsort 进行排序,然后使用 iloc 来尊重该排序。最后,我使用a[::-1] 进行反向排序。

    a = np.lexsort([
        df.D.values,
        df.groupby(level=[0, 1]).D.transform('sum').values,
        df.groupby(level=0).D.transform('sum').values
    ])
    
    df.iloc[a[::-1]]
    
                       D
    A     B    C        
    Gran2 Par3 Child2  8
               Child1  6
          Par2 Child1  8
               Child3  3
               Child2  2
          Par1 Child1  3
    Gran1 Par1 Child2  7
               Child1  3
               Child3  2
          Par2 Child1  9
               Child2  2
          Par3 Child1  6
    

    【讨论】:

      猜你喜欢
      • 2016-01-16
      • 2019-02-06
      • 2015-04-06
      • 2022-07-28
      • 2019-08-16
      • 2021-01-07
      • 2021-08-06
      • 2018-09-18
      • 2018-11-06
      相关资源
      最近更新 更多