выполнить удержание для каждой группы на основе значения строк в столбце - PullRequest
0 голосов
/ 10 марта 2020

У меня есть ниже датафрейм:

import pandas as pd
df = pd.DataFrame({'ID':[1,1,1,2,2,2,3,3,4,4,4],
                  'money':[300,300,300,400,400,400,500,500,600,600,600],
                  'type':['a','b','c','a','b','c','b','c','a','b','c'],
                  'total':[30,10,20,10,10,30,40,40,10,20,30]})
df

I wi sh, чтобы найти процент для каждой строки в столбце ['total']. Например,

['ID'] = 1

у нас есть

['total'] = [30,10,20]

Я хочу, чтобы оно было в форме:

30+10+20 = 60

30/60 = 0.5
10/60 = 0.167
20/60  = 0.33

, чтобы я получил таблицу как ниже

ID  money   type    total   percentage
0   1   300 a   30  0.500
1   1   300 b   10  0.167
2   1   300 c   20  0.333
3   2   400 a   10  0.200
4   2   400 b   10  0.200
5   2   400 c   30  0.600
6   3   500 b   40  0.500
7   3   500 c   40  0.500
8   4   600 a   10  0.167
9   4   600 b   20  0.333
10  4   600 c   30  0.500

Ответы [ 2 ]

1 голос
/ 10 марта 2020

Используйте Series.div с GroupBy.transform для совокупных значений до Series с размером сэма, таким как оригинал, последнее добавление Series.round:

df['percentage'] = df['total'].div(df.groupby('ID')['total'].transform('sum')).round(3)
print (df)
    ID  money type  total  percentage
0    1    300    a     30       0.500
1    1    300    b     10       0.167
2    1    300    c     20       0.333
3    2    400    a     10       0.200
4    2    400    b     10       0.200
5    2    400    c     30       0.600
6    3    500    b     40       0.500
7    3    500    c     40       0.500
8    4    600    a     10       0.167
9    4    600    b     20       0.333
10   4    600    c     30       0.500

Деталь :

print (df.groupby('ID')['total'].transform('sum'))
0     60
1     60
2     60
3     50
4     50
5     50
6     80
7     80
8     60
9     60
10    60
Name: total, dtype: int64

Альтернативное решение с лямбда-функцией:

df['percentage'] = df.groupby('ID')['total'].transform(lambda x: x.div(x.sum())).round(3)
1 голос
/ 10 марта 2020

Вы можете использовать groupby + transform, чтобы найти сумму итогов по ID, а затем разделить итоги на эту сумму:

df['percentage'] = df.total / df.groupby('ID').total.transform('sum')

    ID  money type  total  percentage
0    1    300    a     30    0.500000
1    1    300    b     10    0.166667
2    1    300    c     20    0.333333
3    2    400    a     10    0.200000
4    2    400    b     10    0.200000
5    2    400    c     30    0.600000
6    3    500    b     40    0.500000
7    3    500    c     40    0.500000
8    4    600    a     10    0.166667
9    4    600    b     20    0.333333
10   4    600    c     30    0.500000
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...