如何在熊猫中进行Groupby Ratio计算

时间:2018-08-23 02:53:55

标签: python python-3.x pandas

我有一个如下的pandas数据框。对于原始组合和目标组合,当Flag列的值等于Y时,我需要计算成功率。

输入

ORG DSTN    FLAG
LON SIN      Y
ADL SIN      N
SIN LON      N
LON SIN      Y
LON SIN      N
ADL SIN      Y
ADL SIN      N
SIN LON      Y
SIN LON      Y
SIN LON      Y
SIN LON      N
LON SIN      N

预期产量

ORG DSTN    FLAG    Ratio
LON SIN      Y       0.5
ADL SIN      N       0.3
SIN LON      N       0.6
LON SIN      Y       0.5
LON SIN      N       0.5
ADL SIN      Y       0.3
ADL SIN      N       0.3
SIN LON      Y       0.6
SIN LON      Y       0.6
SIN LON      Y       0.6
SIN LON      N       0.6
LON SIN      N       0.5

如何在熊猫中做到这一点。

2 个答案:

答案 0 :(得分:2)

value_countsnormalize=True一起使用:

s = (df.groupby(['ORG', 'DSTN']).FLAG
        .value_counts(normalize=True).rename('Ratio').reset_index()
)

然后更改其中FLAG等于N与其对应的Y值的行,并合并:

s.loc[s.FLAG.eq('N'), 'Ratio'] = 1.0 - s.Ratio
df.merge(s, how='left')

   ORG DSTN FLAG     Ratio
0   LON  SIN    Y  0.500000
1   ADL  SIN    N  0.333333
2   SIN  LON    N  0.600000
3   LON  SIN    Y  0.500000
4   LON  SIN    N  0.500000
5   ADL  SIN    Y  0.333333
6   ADL  SIN    N  0.333333
7   SIN  LON    Y  0.600000
8   SIN  LON    Y  0.600000
9   SIN  LON    Y  0.600000
10  SIN  LON    N  0.600000
11  LON  SIN    N  0.500000

答案 1 :(得分:0)

您还可以分组,然后将所有内容替换为FLAG=='Y'的分组比例

 df.assign(Ratio=df.groupby(['ORG','DSTN']).FLAG.apply(lambda x:x.replace('Y|N',(x=='Y').mean(),regex=True)))
Out[174]: 
    ORG DSTN FLAG     Ratio
0   LON  SIN    Y  0.500000
1   ADL  SIN    N  0.333333
2   SIN  LON    N  0.600000
3   LON  SIN    Y  0.500000
4   LON  SIN    N  0.500000
5   ADL  SIN    Y  0.333333
6   ADL  SIN    N  0.333333
7   SIN  LON    Y  0.600000
8   SIN  LON    Y  0.600000
9   SIN  LON    Y  0.600000
10  SIN  LON    N  0.600000
11  LON  SIN    N  0.500000