我有一个数据帧df:
VID SFID SFReps
0 0000F0DD 000C5AF6 9
1 0000F0DD 000E701F 16
2 0000F0DD 00481C04 1
3 0000F0DD 004DCD04 1
4 0000F0DD 006CD213 1
5 0000F0DD 00889D31 9
6 0000AAAA 00F8733A 4
7 0000AAAA 00FDD591 1
8 0000AAAA 01243458 4
9 0000AAAA 01292867 16
10 0000AAAA 0131445A 9
11 0000AAAA 013CB69F 1
我想计算每个SFReps代表每个VID组的百分比。
所以结果应该是这样的:
VID SFID SFReps SFPercent
0 0000F0DD 000C5AF6 9 0.24
1 0000F0DD 000E701F 16 0.43
2 0000F0DD 00481C04 1 0.03
3 0000F0DD 004DCD04 1 0.03
4 0000F0DD 006CD213 1 0.03
5 0000F0DD 00889D31 9 0.24
6 0000AAAA 00F8733A 4 0.11
7 0000AAAA 00FDD591 1 0.03
8 0000AAAA 01243458 4 0.11
9 0000AAAA 01292867 16 0.46
10 0000AAAA 0131445A 9 0.26
11 0000AAAA 013CB69F 1 0.03
我知道我可以使用groupby
对每个VID值进行分组,但之后我就难倒了。
循环遍历每一行是一种选择,但我知道有更好的方法可以做到这一点。
答案 0 :(得分:3)
您可以将transform
和Series
创建的新sum
划分为与原始df
相同的索引:
print (df.groupby('VID')['SFReps'].transform('sum'))
0 37
1 37
2 37
3 37
4 37
5 37
6 35
7 35
8 35
9 35
10 35
11 35
Name: SFReps, dtype: int64
df['SFPercent'] = df.SFReps / df.groupby('VID')['SFReps'].transform('sum')
print (df)
VID SFID SFReps SFPercent
0 0000F0DD 000C5AF6 9 0.243243
1 0000F0DD 000E701F 16 0.432432
2 0000F0DD 00481C04 1 0.027027
3 0000F0DD 004DCD04 1 0.027027
4 0000F0DD 006CD213 1 0.027027
5 0000F0DD 00889D31 9 0.243243
6 0000AAAA 00F8733A 4 0.114286
7 0000AAAA 00FDD591 1 0.028571
8 0000AAAA 01243458 4 0.114286
9 0000AAAA 01292867 16 0.457143
10 0000AAAA 0131445A 9 0.257143
11 0000AAAA 013CB69F 1 0.028571
df['SFPercent'] = df.SFReps.div(df.groupby('VID')['SFReps'].transform('sum'))
print (df)
VID SFID SFReps SFPercent
0 0000F0DD 000C5AF6 9 0.243243
1 0000F0DD 000E701F 16 0.432432
2 0000F0DD 00481C04 1 0.027027
3 0000F0DD 004DCD04 1 0.027027
4 0000F0DD 006CD213 1 0.027027
5 0000F0DD 00889D31 9 0.243243
6 0000AAAA 00F8733A 4 0.114286
7 0000AAAA 00FDD591 1 0.028571
8 0000AAAA 01243458 4 0.114286
9 0000AAAA 01292867 16 0.457143
10 0000AAAA 0131445A 9 0.257143
11 0000AAAA 013CB69F 1 0.028571
如有必要,请稍后添加round
:
df['SFPercent'] = df.SFReps.div(df.groupby('VID')['SFReps'].transform('sum')).round(2)
print (df)
VID SFID SFReps SFPercent
0 0000F0DD 000C5AF6 9 0.24
1 0000F0DD 000E701F 16 0.43
2 0000F0DD 00481C04 1 0.03
3 0000F0DD 004DCD04 1 0.03
4 0000F0DD 006CD213 1 0.03
5 0000F0DD 00889D31 9 0.24
6 0000AAAA 00F8733A 4 0.11
7 0000AAAA 00FDD591 1 0.03
8 0000AAAA 01243458 4 0.11
9 0000AAAA 01292867 16 0.46
10 0000AAAA 0131445A 9 0.26
11 0000AAAA 013CB69F 1 0.03