熊猫按一列分组,然后按另一列分组

时间:2019-07-05 11:19:32

标签: python python-3.x pandas dataframe pandas-groupby

我有一个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,其amount50内是BB10,其中amount50%的百分比;结果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 个答案:

答案 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%