2017-02-15 9 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グループに対して占めるパーセンテージを計算します。

だから、結果は次のようなものでなければなりません:私はグループに私ができるgroupbyを使用して、各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 

各行のルーピングはオプションですが、これを実行するより良い方法があることはわかっています。

答えて

2

あなたは、元のdfと同じインデックスのためtransformsumによって作成された新しい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