如何在熊猫中进行分组比率计算



我有一个熊猫数据帧,如下所示。当Flag列的值等于 orgin 和目标组合的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

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

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

好吧,您也可以分组,然后用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

最新更新