2017-02-15 4 views
-1

У меня есть dataframe ДФ:Вычислить проценты для подгрупп в панде dataframe

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 

Я знаю, что можно сгруппировать каждое значение VID с помощью groupby, но после того, что я в тупике.

Цитирование через каждую строку является опцией, но я знаю, что есть лучший способ сделать это.

ответ

2

можно разделить на новый Series созданный transform и 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