Python pandas: простая агрегация и сортировка строк pivot_table

Я пытаюсь добиться чего-то с пандами, что очень просто сделать в сводной таблице Excel:

Python pandas: простая агрегация и сортировка строк pivot_table

Python pandas: простая агрегация и сортировка строк pivot_table

Python pandas: простая агрегация и сортировка строк pivot_table

Из того, что я видел, следующий код кажется логичным, но он не работает. И в итоге мне интересно, насколько сложным может быть реализация такой простой агрегации. Какие-либо предложения?

pt = pd.pivot_table(data=df,
           aggfunc = 'count',
           index = ["root_name", "rca"],
           values = ["rca"],
           margins = True).sort_values(['rca'], 
           ascending=[False])

Обновлено: образцы входных данных и выходных данных

    try: from io import StringIO  # Python 3
except: from StringIO import StringIO  # Python 2

import pandas as pd

TESTDATA = u"""root_name;rca
Mobile Voice;mib manual manipulation
Mobile Voice;mib manual manipulation
Internet;dq
Mobile Voice;defect
Internet;mnp
Mobile Voice;mnp
Mobile Voice;defect
Mobile Voice;ceased in mib before dqt run
Mobile Voice;mnp
Mobile Voice;ceased in mib before dqt run
Internet;dq
Mobile Voice;mnp
Mobile Voice;dq
Mobile Voice;no dq
Mobile Voice;no dq
Mobile Voice;asset ceased while order was pending
Internet;dq
Mobile Voice;no dq
Internet;mnp
Mobile Voice;mnp
Mobile Voice;salto replication delay
Mobile Voice;provide order created dq
Internet;mnp
Mobile Voice;mib manual manipulation
Mobile Voice;mnp
Mobile Voice;mnp
Mobile Voice;ceased in mib before dqt run
Mobile Voice;mnp
Mobile Voice;mib manual manipulation
"""

df = pd.read_csv(StringIO(TESTDATA), sep=';', usecols= ['root_name', 'rca'], engine='python')

pt = pd.pivot_table(data=df,
               aggfunc = 'count',
               index = ["root_name", "rca"],
               values = ["rca"],
               margins = True)


print (pt.sort_values(['rca'], 
               ascending=[False]))

Результат: Пустой фрейм данных Столбцы: [] Индекс: [(Mobile Voice, сальто задержка репликации), (Mobile Voice, обеспечить порядок создания dq), (Mobile Voice, без dq), (Интернет, mnp), (Mobile Voice, mnp), (Mobile Voice, ручное управление mib ), (Интернет, dq), (Мобильный голос, dq), (Мобильный голос, дефект), (Мобильный голос, отключен в mib до запуска dqt), (Мобильный голос, актив отключен, пока заказ находится в ожидании), (Все, ) ]

вы должны предоставить минимальный пример (ввод + вывод) как текст

mozway 13.05.2022 16:53

@mozway Спасибо за ваш комментарий, только что добавил простой тестовый пример.

Rafael Salvador 13.05.2022 17:16

и какова ожидаемая логика и вывод?

mozway 13.05.2022 17:22

Ожидаемый результат — это то, что изображено на первом изображении сводной таблицы Excel. С точки зрения панд, мультииндекс для root_name и rca и соответствующих итогов.

Rafael Salvador 13.05.2022 17:27
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
4
41
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Попробуйте добавить поле count в свой фрейм данных, а затем просто сгруппируйте его с помощью метода count():

df['count'] = 1
df.groupby(by=['root_name', 'rca']).count().sort_index('rca')

Выход:

                                                   count
root_name    rca                                        
Internet     dq                                        3
             mnp                                       3
Mobile Voice asset ceased while order was pending      1
             ceased in mib before dqt run              3
             defect                                    2
             dq                                        1
             mib manual manipulation                   4
             mnp                                       7
             no dq                                     3
             provide order created dq                  1
             salto replication delay                   1

Небольшая настройка для воспроизведения результатов Excel путем добавления поля суммы «root_name»:

grouped_sum = df.groupby(by='root_name').sum().reset_index(level=[0])
grouped = df.merge(grouped_sum, how='left', on='root_name')
grouped.rename(columns = {'count_x': 'count', 'count_y': 'sum'}, inplace=True)
grouped
       root_name                                   rca  count  sum
0   Mobile Voice               mib manual manipulation      1   23
1   Mobile Voice               mib manual manipulation      1   23
2       Internet                                    dq      1    6

pd.pivot_table(
           data=grouped,
           aggfunc=['count'],
           index=[ "root_name", "sum", "rca"],
           values=["count"],
           margins=True).sort_values(["sum", 'root_name', 'rca'], 
           ascending=[False, True, True]
)

Выход:

                                                      count
                                                      count
root_name    sum rca                                       
All                                                      29
Mobile Voice 23  asset ceased while order was pending     1
                 ceased in mib before dqt run             3
                 defect                                   2
                 dq                                       1
                 mib manual manipulation                  4
                 mnp                                      7
                 no dq                                    3
                 provide order created dq                 1
                 salto replication delay                  1
Internet     6   dq                                       3
                 mnp                                      3

Спасибо за ваш ответ! Это действительно ближе к тому, что я пытаюсь получить. Но все же, «Мобильный голос» как первый уровень содержит больше «rca», чем «Интернет». Как я могу сортировать на основе первого уровня, чтобы в этом случае «Мобильный голос» отображался первым, а все его rca были прямо под ним?

Rafael Salvador 13.05.2022 17:43

Означает ли это, что вам нужны «суммы» для каждого root_name, а затем вам также нужно применить сортировку на основе этого?

Sergey Sakharovskiy 13.05.2022 17:44

Правильно, и сортировка должна основываться на количестве rca каждого root_name. Например. Всего у «Mobile Voice» 50 rca, он должен появиться первым с его rca справа внизу. Тогда "Интернет" имеет 35, должно появиться рядом. "Some other roor_name" имеет 20 rca, появляется рядом и так далее. В основном то же самое показано в сводной таблице Excel.

Rafael Salvador 13.05.2022 17:55

Вы можете добиться этого, вычислив суммы поля «root_name» и объединив их с основным фреймом данных. Я отредактировал решение.

Sergey Sakharovskiy 13.05.2022 18:27

Понял, вот и все! Большое спасибо за твою помощь! Тем не менее, мое беспокойство оказывается правдой, не так уж интуитивно понятно воспроизводить с помощью pandas простейшую сводную таблицу Excel.

Rafael Salvador 13.05.2022 19:09

Другие вопросы по теме