计算pandas数据帧中子组的百分比

时间:2017-02-15 09:48:02

标签: python pandas dataframe

我有一个数据帧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值进行分组,但之后我就难倒了。

循环遍历每一行是一种选择,但我知道有更好的方法可以做到这一点。

1 个答案:

答案 0 :(得分:3)

您可以将transformSeries创建的新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