#python #pandas #pandas-groupby
#python #pandas #pandas-groupby
Вопрос:
У меня есть этот набор данных:
=== ======= ====== ======= =======
| | Group | Cost | Name1 | Name2 |
=== ======= ====== ======= =======
| 0 | G1 | 1574 | N1A | N2A |
--- ------- ------ ------- -------
| 1 | G2 | 1322 | N1B | N2B |
--- ------- ------ ------- -------
| 2 | G3 | 1188 | N1C | N2C |
--- ------- ------ ------- -------
| 3 | G3 | 942 | N1D | N2D |
--- ------- ------ ------- -------
| 4 | G4 | 838 | N1E | N2E |
--- ------- ------ ------- -------
| 5 | G5 | 5 | N1F | N2F |
--- ------- ------ ------- -------
| 6 | G5 | 4 | N1F | N2G |
--- ------- ------ ------- -------
| 7 | G5 | 3 | N1G | N2H |
--- ------- ------ ------- -------
Теперь я хочу сгруппировать по «Группе» и добавить сгруппированный столбец с суммой столбцов «Стоимость» для каждой группы. Не знаю, как объяснить, так что вот ожидаемый результат:
=== ======= ====== ====== ======= =======
| | Group | Sum | Cost | Name1 | Name2 |
=== ======= ====== ====== ======= =======
| 0 | G1 | 1574 | 1574 | N1A | N2A |
--- ------- ------ ------ ------- -------
| 1 | G2 | 1322 | 1322 | N1B | N2B |
--- ------- ------ ------ ------- -------
| 2 | G3 | 2130 | 1188 | N1C | N2C |
| | | ------ ------- -------
| | | | 942 | N1D | N2D |
--- ------- ------ ------ ------- -------
| 3 | G4 | 838 | 838 | N1E | N2E |
--- ------- ------ ------ ------- -------
| 4 | G5 | 12 | 5 | N1F | N2F |
| | | ------ ------- -------
| | | | 4 | N1F | N2G |
| | | ------ ------- -------
| | | | 3 | N1G | N2H |
--- ------- ------ ------ ------- -------
Как я могу добиться этого с помощью pandas? Возможно ли это вообще? Извините, я новичок в этом
Комментарии:
1. Pandas не имеет понятия
merged cells
as в Excel. Вы можете использовать MultiIndex для получения визуального эффекта.
Ответ №1:
Используйте GroupBy.transform
with sum
, а затем для отображения вашего способа create MultiIndex
by DataFrame.set_index
, но 'missing'
значения в MulitIndex
только не отображаются:
df['Sum'] = df.groupby('Group')['Cost'].transform('sum')
df = df.set_index(['Group','Sum','Cost'])
Или:
df1 = (df.assign(Sum = df.groupby('Group')['Cost'].transform('sum'))
.set_index(['Group','Sum','Cost']))