2017-02-15 150 views
-1

我有一个数据帧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值,但在那之后我很为难。

循环遍历每行是一个选项,但我知道有一个更好的方法来做到这一点。

回答

2

您可以通过transformsum为相同的索引原df创造了新的Series划分:

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