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