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)