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

Posted

技术标签:

【中文标题】在遵循特定结构的同时按列对多索引进行排序【英文标题】:Sorting multiindex by a column while following specific structure 【发布时间】:2019-08-25 13:08:15 【问题描述】:

我正在使用 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:根据 Wen-Ben 的回答,我的第二个问题的答案是 df.iloc[(df.groupby(level=[0,1]).D.transform('min')).argsort().values]

【问题讨论】:

【参考方案1】:

看来你需要argsort

df.iloc[(-df.groupby(level=[0,1]).D.transform('max')).argsort().values]
Out[416]: 
                   D
Gran1 Par2 Child1  9
           Child2  2
Gran2 Par3 Child1  6
           Child2  8
Gran1 Par1 Child1  3
           Child2  7
           Child3  2
      Par3 Child1  6
Gran2 Par2 Child1  6
           Child2  2
           Child3  3
      Par1 Child1  3

【讨论】:

这很完美,谢谢!如果我希望它从小到大,我将如何以相反的顺序进行操作?看起来 .transform('min') 不适合我 删除- df.iloc[(df.groupby(level=[0,1]).D.transform('max')).argsort().values] @rashb @rashb ummm 你的实际数据集是什么 此解决方案适用于我的示例,但不适用于我的数据集。每个祖父母索引的 D 列中的最小值按 -52、-59、-22、-70、-175 的顺序排列。我需要提供完整的输出来帮助给出一些上下文吗? 我将在另一条评论中发布我想要的输出是什么,请稍等。顺便感谢所有的帮助,谢谢!

以上是关于在遵循特定结构的同时按列对多索引进行排序的主要内容,如果未能解决你的问题,请参考以下文章

在保持二级索引完整的同时对多索引数据框中的行进行排序

排序多索引数据框保持索引排序

在 Bootstrap-Vue 中按列对 <b-table> 进行排序并禁止用户排序

在保留结构的同时划分2个多索引数据帧

如何在特定级别重新排序多索引数据框列

按列对python数组/recarray进行排序