промежуточный итог и процент фрейма данных

#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