我有一个熊猫数据帧,如下所示。当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_counts
与normalize=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