Сначала агрегировать по обоим столбцам 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%