Разгруппировка 1 столбца в несколько
Коллеги, всех приветствую! Имеется следующая задача: у меня есть DataFrame, который содержит столбец критерий, нем есть множество других категорий, мне нужно их разгруппировать.
df_3['Критерий'].unique()
array(['views', 'visitors', 'gender', 'age', 'gender_age', 'members',
'reach_subscribers'], dtype=object)
Также прикрепляю фрагмент датайрема:
Дата Критерий Парам. №1 Парам. №2 Значение
0 26.12.2023 views NaN NaN 201
1 26.12.2023 visitors NaN NaN 139
2 26.12.2023 gender Ж NaN 95
3 26.12.2023 gender М NaN 33
4 26.12.2023 age 1-18 NaN 2
5 26.12.2023 age 18-21 NaN 5
6 26.12.2023 age 21-24 NaN 14
7 26.12.2023 age 24-27 NaN 8
8 26.12.2023 age 27-30 NaN 14
9 26.12.2023 age 30-35 NaN 29
10 26.12.2023 age 35-45 NaN 36
11 26.12.2023 age 45+ NaN 17
12 26.12.2023 gender_age Ж 1-18 2
13 26.12.2023 gender_age Ж 18-21 3
14 26.12.2023 gender_age Ж 21-24 9
15 26.12.2023 gender_age Ж 24-27 6
16 26.12.2023 gender_age Ж 27-30 12
17 26.12.2023 gender_age Ж 30-35 20
18 26.12.2023 gender_age Ж 35-45 27
19 26.12.2023 gender_age Ж 45+ 14
20 26.12.2023 gender_age М 18-21 2
21 26.12.2023 gender_age М 21-24 5
22 26.12.2023 gender_age М 24-27 2
23 26.12.2023 gender_age М 27-30 2
24 26.12.2023 gender_age М 30-35 9
25 26.12.2023 gender_age М 35-45 9
26 26.12.2023 gender_age М 45+ 3
60 26.12.2023 members Новые участники NaN 7
61 25.12.2023 views NaN NaN 1375
62 25.12.2023 visitors NaN NaN 765
63 25.12.2023 gender Ж NaN 521
64 25.12.2023 gender М NaN 180
Мне нужно разгруппировать критерии по имени, например: age, views, visitors и т.д по всем критериям, и также сделать их частью DataFrame с их значением.
Пытался сделать с помощью такой команды:
#df_3.groupby('Критерий', as_index =False).aggregate({'Значение' : 'sum'})
Получилось не то:
Критерий Значение
0 age 24012
1 gender 24543
2 gender_age 24012
3 members 2958
4 reach_subscribers 287952
5 views 45416
6 visitors 25892
Результат, который я хочу видеть:
Дата Критерий Парaметр Значение
26.12.2023 gender-age Ж,1-18 5
26.12.2023 gender-age М,1-18 7
26.12.2023 gender-age Ж,18-21 11
26.12.2023 gender-age М,18-21 13
26.12.2023 views - 1000
Ответы (2 шт):
Если Вы хотите в каждую строку исходного датафрейма добавить искомую сумму, то тогда надо использовать связку .groupby() - .transform():
df_3['total_sum'] = df_3.groupby('Критерий')['Значение'].transform('sum')
Не уверен, что правильно понял вопрос, но вы вполне можете сделать группировку по нескольким столбцам:
res = df.groupby(["Критерий","Парам. №1", "Парам. №2"], dropna=False, as_index=False)["Значение"].sum().fillna("-")
res['Параметр'] = res[['Парам. №1', 'Парам. №2']].agg(', '.join, axis=1)
res = res[["Критерий", "Параметр", "Значение"]]
для приведенного в вопросе примера результат будет:
Критерий Параметр Значение
0 age 1-18, - 2.0
1 age 18-21, - 5.0
2 age 21-24, - 14.0
3 age 24-27, - 8.0
4 age 27-30, - 14.0
5 age 30-35, - 29.0
6 age 35-45, - 36.0
7 age 45+, - 17.0
8 gender Ж, - 616.0
9 gender М, - 213.0
10 gender_age Ж, 1-18 2.0
11 gender_age Ж, 18-21 3.0
12 gender_age Ж, 21-24 9.0
13 gender_age Ж, 24-27 6.0
14 gender_age Ж, 27-30 12.0
15 gender_age Ж, 30-35 20.0
16 gender_age Ж, 35-45 27.0
17 gender_age Ж, 45+ 14.0
18 gender_age М, 18-21 2.0
19 gender_age М, 21-24 5.0
20 gender_age М, 24-27 2.0
21 gender_age М, 27-30 2.0
22 gender_age М, 30-35 9.0
23 gender_age М, 35-45 9.0
24 gender_age М, 45+ 3.0
25 members Новые участники, - 7.0
26 views -, - 1576.0
27 visitors -, - 904.0