按组的百分比

时间:2015-11-29 21:22:23

标签: python python-3.x pandas

给出以下数据框:

DF = pd.DataFrame({'Site': ['A', 'A', 'A', 'A', 'B', 'B','B','B'], 
                   'Score': [1, -1, -0.5, 1, 0, -1, 2, 4], 
                   'Group': [1, 1, 2, 2, 1, 1, 2, 2]})
DF
    Group   Score   Site
0   1        1.0    A
1   1       -1.0    A
2   2       -0.5    A
3   2        1.0    A
4   1        0.0    B
5   1       -1.0    B
6   2        2.0    B
7   2        4.0    B

我想让pandas添加一个列,显示每个站点的得分等于或大于0的行百分比(即站点B中4行中的3行为零或以上,因此结果为75% )和另一列显示每个站点内的组百分比(即站点A中的组1在2中有1个得分,其为零或以上,因此结果为50%)。期望的结果如下:

    Group   Score   Site    Site%   SiteGroup%
0      1    1.0        A    0.5     0.5
1      1   -1.0        A    0.5     0.5
2      2   -0.5        A    0.5     0.5
3      2    1.0        A    0.5     0.5
4      1    0.0        B    0.75    0.5
5      1   -1.0        B    0.75    0.5
6      2    2.0        B    0.75    1
7      2    4.0        B    0.75    1

提前致谢!

1 个答案:

答案 0 :(得分:1)

你可以尝试:

df['score_indicator'] = df.Score.apply(lambda x: 1 if x >=0 else 0)
df['Site%'] = df.groupby('Site')['score_indicator'].transform(lambda x: x.sum() / x.count())
df['Group%'] = df.groupby(['Site','Group'])['score_indicator'].transform(lambda x: x.sum() / x.count())

获取

print(df)
   Group  Score Site  score_indicator  Site%  Group%
0      1    1.0    A                1   0.50    0.50
1      1   -1.0    A                0   0.50    0.50
2      2   -0.5    A                0   0.50    0.75
3      2    1.0    A                1   0.50    0.75
4      1    0.0    B                1   0.75    0.50
5      1   -1.0    B                0   0.75    0.50
6      2    2.0    B                1   0.75    0.75
7      2    4.0    B                1   0.75    0.75