Python 根据列中的行值为每个组执行扣减

Python 根据列中的行值为每个组执行扣减,python,pandas,dataframe,Python,Pandas,Dataframe,我有以下数据帧: 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':[

我有以下数据帧:

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
我想在['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

您可以使用
groupby
+
transform
ID
查找总计的总和,然后将总计除以该总和:

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


您可以使用
groupby
+
transform
ID
查找总计的总和,然后将总计除以该总和:

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

用于将值聚合到sam大小与原始值相同的系列,最后添加:

详细信息

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
具有lambda函数的替代解决方案:

df['percentage'] = df.groupby('ID')['total'].transform(lambda x: x.div(x.sum())).round(3)
用于将值聚合到sam大小与原始值相同的系列,最后添加:

详细信息

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
具有lambda函数的替代解决方案:

df['percentage'] = df.groupby('ID')['total'].transform(lambda x: x.div(x.sum())).round(3)