#python #dataframe #subtotal
#python #фрейм данных #промежуточный итог
Вопрос:
У меня есть фрейм данных, который выглядит следующим образом:
Моя конечная цель — вычислить процент каждой цели и для каждого источника
итак, итоговая таблица должна выглядеть так:
Любая помощь или направление будут высоко оценены 🙂
Заранее спасибо 🙂
Она
Комментарии:
1. Не публикуйте изображения, публикуйте данные, которые можно вырезать и вставить.
Ответ №1:
Используйте transform
, чтобы получить именно то, что вам нужно.
https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas .DataFrame.transform.html .
Несмотря aggregation
на то, что возвращает уменьшенную версию входных данных, лучше всего то transform
, что возвращаемые выходные данные имеют ту же форму, что и входные:
df['%_values'] = 100 * (df['values'] / (df.groupby('Origin')['values'].transform('sum')))
Приведенный выше 1-liner делит каждое значение на сгруппированную сумму значений (сгруппированных по происхождению), а затем возвращает результаты в новом столбце.
который выведет вас:
Origin Destination Purpose values %_values
0 a a business 1490 37.664307
1 a b business 1301 32.886754
2 a c pleasure 1165 29.448938
3 b a pleasure 1777 57.064868
4 b b business 580 18.625562
5 b c pleasure 757 24.309570
6 c a business 1852 41.599281
7 c b pleasure 1949 43.778077
8 c c undeclared 651 14.622642
и, конечно, чтобы получить результат с 0 (или любыми) десятичными знаками, вы можете использовать round
:
df['%_values'] = round(100 * (df['values'] / (df.groupby('Origin')['values'].transform('sum'))))
Origin Destination Purpose values %_values
0 a a business 1490 38.0
1 a b business 1301 33.0
2 a c pleasure 1165 29.0
3 b a pleasure 1777 57.0
4 b b business 580 19.0
5 b c pleasure 757 24.0
6 c a business 1852 42.0
7 c b pleasure 1949 44.0
8 c c undeclared 651 15.0