我有一个如下的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
如何在熊猫中做到这一点。
答案 0 :(得分:2)
将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
答案 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