Я пытаюсь добиться чего-то с пандами, что очень просто сделать в сводной таблице Excel:
Из того, что я видел, следующий код кажется логичным, но он не работает. И в итоге мне интересно, насколько сложным может быть реализация такой простой агрегации. Какие-либо предложения?
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 Спасибо за ваш комментарий, только что добавил простой тестовый пример.
и какова ожидаемая логика и вывод?
Ожидаемый результат — это то, что изображено на первом изображении сводной таблицы Excel. С точки зрения панд, мультииндекс для root_name и rca и соответствующих итогов.






Попробуйте добавить поле 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 были прямо под ним?
Означает ли это, что вам нужны «суммы» для каждого root_name, а затем вам также нужно применить сортировку на основе этого?
Правильно, и сортировка должна основываться на количестве rca каждого root_name. Например. Всего у «Mobile Voice» 50 rca, он должен появиться первым с его rca справа внизу. Тогда "Интернет" имеет 35, должно появиться рядом. "Some other roor_name" имеет 20 rca, появляется рядом и так далее. В основном то же самое показано в сводной таблице Excel.
Вы можете добиться этого, вычислив суммы поля «root_name» и объединив их с основным фреймом данных. Я отредактировал решение.
Понял, вот и все! Большое спасибо за твою помощь! Тем не менее, мое беспокойство оказывается правдой, не так уж интуитивно понятно воспроизводить с помощью pandas простейшую сводную таблицу Excel.
вы должны предоставить минимальный пример (ввод + вывод) как текст