#pandas #sorting #group-by #tabular #subtotal
#панды #сортировка #группа-по #табличный #промежуточный итог
Вопрос:
Пример набора данных (обратите внимание, что каждая комбинация Col_A и Col_B уникальна):
import pandas as pd d = {'Col_A': [1,2,3,4,5,6,9,9,10,11,11,12,12,12,12,12,12,13,13], 'Col_B': ['A','K','E','E','H','A','J','A','L','A','B','A','J','C','D','E','A','J','L'], 'Value':[180,120,35,654,789,34,567,21,235,83,234,648,654,234,873,248,45,67,94] } df = pd.DataFrame(data=d)
Требование состоит в том, чтобы создать таблицу с суммой каждого Col_B, количеством Col_A и общей суммой на Col_A. Покажите категории в Col_B в порядке убывания их общей суммы.
Это то, что у меня есть до сих пор:
df.groupby(['Col_B','Col_A']).agg(['count','sum'])
Результат будет выглядеть так. Тем не менее, я хотел бы добавить промежуточные итоги для каждой категории Col_B и ранжировать эти промежуточные итоги по категориям в порядке убывания, чтобы это соответствовало требованию получения суммы каждого Col_B.
Заранее всем спасибо!
Комментарии:
1. пожалуйста, добавьте свой ожидаемый выходной кадр данных
2. @sammywemmy Спасибо за ваше любезное напоминание. Поскольку ответ с моим желаемым результатом уже есть, я больше не буду вносить правки в этот пост, но обязательно добавлю его в следующий раз, когда у меня возникнет вопрос 🙂
Ответ №1:
Ожидаемый результат мне не ясен, но это то, что вы ищете?
piv = df.groupby(['Col_B', 'Col_A'])['Amount'].agg(['count','sum']).reset_index() tot = piv.groupby('Col_B', as_index=False).sum().assign(Col_A='Total') cat = pd.CategoricalDtype(tot.sort_values('sum')['Col_B'], ordered=True) out = pd.concat([piv, tot]).astype({'Col_B': cat}) .sort_values('Col_B', ascending=False, kind='mergesort') .set_index(['Col_B', 'Col_A'])
gt;gt;gt; out count sum Col_B Col_A J 9 1 567 12 1 654 13 1 67 Total 3 1288 A 1 1 180 6 1 34 9 1 21 11 1 83 12 2 693 Total 6 1011 E 3 1 35 4 1 654 12 1 248 Total 3 937 D 12 1 873 Total 1 873 H 5 1 789 Total 1 789 L 10 1 235 13 1 94 Total 2 329 C 12 1 234 Total 1 234 B 11 1 234 Total 1 234 K 2 1 120 Total 1 120
Комментарии:
1. Привет, @Corralien! Спасибо за ваш ответ. Еще один вопрос. Предположим, что Col_A-это идентификационные номера. Есть ли способ показать промежуточный итог подсчета как количество уникальных идентификаторов? Например, вместо 6 для общей категории А он вернет 5, так как идентификатор 12 встречался дважды.
2. Заменить
tot = ...
наtot = piv.groupby('Col_B', as_index=False).agg({'count': 'size', 'sum': 'sum'}).assign(Col_A='Total')
. Это то, чего ты ожидаешь?