панды сгруппированы по одному столбцу, а затем сгруппированы по другому столбцу - PullRequest
0 голосов
/ 05 июля 2019

у меня есть df,

code    id    amount
BB10    531   20
BB10    531   30
BB10    532   50
BR11    631   10
BR11    632   5
IN20    781   10
IN20    781   20
IN20    781   30

Я хочу сначала groupby df с использованием code и получить общее количество amount в каждой группе

df.groupby('code')['amount'].agg('sum')

тогда мне нравится знать процент amount для конкретной id в конкретной группе code, например, для 531 его amount составляет 50 в пределах BB10, с amount процентом 50%; результат df должен выглядеть так:

code    id    amount    pct
BB10    531   50        50%
BB10    532   50        50%
BR11    631   10        66.7%
BR11    632   5         33.3%
IN20    781   60        100%

1 Ответ

2 голосов
/ 05 июля 2019

Сначала агрегировать по обоим столбцам sum, затем получить общее значение по code делить amount, умножить на 100 и округлить:

df1 = df.groupby(['code','id'], as_index=False)['amount'].sum()
df1['pct']=df1['amount'].div(df1.groupby('code')['amount'].transform('sum')).mul(100).round(1)
print (df1)
   code   id  amount    pct
0  BB10  531      50   50.0
1  BB10  532      50   50.0
2  BR11  631      10   66.7
3  BR11  632       5   33.3
4  IN20  781      60  100.0

Последнее, если это необходимо, проценты преобразовывают значения в строки идобавить %:

df1['pct'] = df1['pct'].astype(str) + '%'
print (df1)
   code   id  amount     pct
0  BB10  531      50   50.0%
1  BB10  532      50   50.0%
2  BR11  631      10   66.7%
3  BR11  632       5   33.3%
4  IN20  781      60  100.0%
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...