在遵循特定结构时按列对多索引进行排序

2024-09-30 01:22:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用pandas根据列(“D”)中的整数对n级数组进行排序。这是非常重要的继承权的集团保持一致的基础上,第一和第三级只有

我试过遵循this solution,其中排序基于索引A和B。但是,我希望根据所需输出中描述的索引A和C进行排序。我已经尝试使用numpy.lexsort()来实现这一点,但是提供的链接中的答案并没有描述如何工作,所以我仍然很困惑

a = np.lexsort([results.tx.values,
                results.groupby(level=[0,1]).tx.transform('sum').values, 
                results.groupby(level=0).tx.transform('sum').values])

这将基于第一个和第二个索引进行排序,如示例链接中所示

输入示例:

                    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  6
            Child2  2
            Child3  3
      Par3  Child1  6
            Child2  8

我得到的输出:

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

我想要的输出:

                    D
A     B     C

Gran1 Par2  Child1  9  <--
            Child2  2
Gran2 Par3  Child1  6
            Child2  8  <-- 
Gran1 Par1  Child1  3
            Child2  7  <--
            Child3  2
Gran2 Par2  Child1  6  <--
            Child2  2
            Child3  3
      Par1  Child1  4  <--
Gran1 Par3  Child1  2  <--

如您所见,我希望将A+B索引对中的最高值与其所有子索引一起带到顶部,同时将B索引中的其他值分开。尝试这种排序时,保持索引C中的子级的顺序相同是有帮助的,但不是必需的。在此问题上的任何帮助将不胜感激,谢谢

编辑:我也希望按相反的顺序执行此操作,以便每个祖父母索引的最小值上升到顶部。请注意,此示例与上面的示例无关

期望输出:


                         D
    A     B     C

    Gran1 Par2  Child1  -15  
                Child2  -175  <--
                Child3  -65
    Gran2 Par3  Child1  -77   <--
                Child2   8     
    Gran1 Par1  Child1   3
                Child2   7  
                Child3  -12   <--
    Gran2 Par2  Child1   6    <--
                Child2   2
                Child3   3
          Par1  Child1   12  <--
    Gran1 Par3  Child1   24  <--

我得到的输出:

                     D
A     B     C

Gran2 Par3  Child1  -77   <--
            Child2   8     
Gran1 Par2  Child1  -15  
            Child2  -175  <--
            Child3  -65
      Par1  Child1   3
            Child2   7  
            Child3  -12   <--
Gran2 Par2  Child1   6    <--
            Child2   2
            Child3   3
      Par1  Child1   12  <--
Gran1 Par3  Child1   24  <--

Edit2:我的第二个问题的答案是df.iloc[(df.groupby(level=[0,1]).D.transform('min')).argsort().values]基于文本的答案


Tags: 答案示例排序resultsvaluesgroupbytxpar2

热门问题