Сортировка мультииндекса по столбцу при определенной структуре - PullRequest
0 голосов
/ 04 апреля 2019

Я использую панды для сортировки массива n уровней на основе целых чисел в столбце («D»). Очень важно, чтобы иерархия групп оставалась неизменной на основе 1-го и 3-го уровня только .

Я попытался следовать этому решению , где сортировка основана на индексах 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] на основании ответа Вэнь-Бена

1 Ответ

0 голосов
/ 04 апреля 2019

Похоже, вам нужно 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
...