我有一个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%
答案 0 :(得分:2)
首先按两列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%