Как суммировать несколько значений в столбце данных, если они соответствуют 1 значению в другом столбце - PullRequest
0 голосов
/ 31 октября 2019

У меня есть такой фрейм данных:

Code  Group        Name   Number
ABC   Group_1_ABC  Mike   40
                   Amber  60
      Group_2_ABC  Rachel 90
XYZ   Group_1_XYZ  Bob    30
                   Peter  75
                   Nikki  55
      Group_2_XYZ  Julia  23
                   Ross   80
LMN   Group_1_LMN  Paul   95
.     .            .      .
.     .            .      .

Я создал этот фрейм данных, сгруппировав по коду, группе, имени и суммируя число.

Теперь я хочу вычислитьпроцент каждого имени для определенного кода. Для этого я хочу суммировать все числа, которые являются частью одного кода. Я делал это, чтобы рассчитать процент.

df['Percentage']= (df['Number']/df['??'])*100

Теперь, что касается общей суммы для каждой группы, я не могу понять, как ее рассчитать? Я хочу, чтобы общая сумма для каждой категории кода, чтобы рассчитать процент.

Так, например, для Code: ABC общая сумма должна составлять 40 + 60 + 90 = 190. Эти 190 будут затем разделены на все числа для каждого пользователя в ABC, чтобы вычислить их процент для соответствующей категории кода. Таким образом, технически группа и имя столбца не играют никакой роли в расчете общей суммы для каждой категории кода.

1 Ответ

0 голосов
/ 31 октября 2019

Использовать GroupBy.transform по первому уровню или по имени уровня Code:

df['Percentage']= (df['Number']/df.groupby(level=0)['Number'].transform('sum'))*100

df['Percentage']= (df['Number']/df.groupby(level=['Code'])['Number'].transform('sum'))*100

Или в последних версиях панд не обязательно указывать параметр уровня:

df['Percentage']= (df['Number']/df.groupby('Code')['Number'].transform('sum'))*100

print (df)
                         Number  Percentage
Code Group       Name                      
ABC  Group_1_ABC Mike        40   21.052632
                 Amber       60   31.578947
     Group_2_ABC Rachel      90   47.368421
XYZ  Group_1_XYZ Bob         30   11.406844
                 Peter       75   28.517110
                 Nikki       55   20.912548
     Group_2_XYZ Julia       23    8.745247
                 Ross        80   30.418251
LMN  Group_1_LMN Paul        95  100.000000

Деталь :

print (df.groupby(level=0)['Number'].transform('sum'))
Code  Group        Name  
ABC   Group_1_ABC  Mike      190
                   Amber     190
      Group_2_ABC  Rachel    190
XYZ   Group_1_XYZ  Bob       263
                   Peter     263
                   Nikki     263
      Group_2_XYZ  Julia     263
                   Ross      263
LMN   Group_1_LMN  Paul       95
Name: Number, dtype: int64
...