我有一个如下所示的数据框
EC2
其中
No_Show =不出现的概率
假设
阈值概率= 0.2 每个广告位的持续时间= 30(分钟)
从上面我想计算下面的数据框
第一步
根据会话,slot_number和Patient_count排序数据框
B_ID No_Show Session slot_num Patient_count
1 0.2 S1 1 1
2 0.3 S1 2 1
3 0.8 S1 3 1
4 0.3 S1 3 2
5 0.6 S1 4 1
6 0.8 S1 5 1
7 0.9 S1 5 2
8 0.4 S1 5 3
9 0.6 S1 5 4
12 0.9 S2 1 1
13 0.5 S2 1 2
14 0.3 S2 2 1
15 0.7 S2 3 1
20 0.7 S2 4 1
16 0.6 S2 5 1
17 0.8 S2 5 2
19 0.3 S2 5 3
第2步使用以下条件计算截止值
如果Patient_count = 1 如果Patient_count = 1,则将No_show除以阈值概率
df = df.sort_values(['Session', 'slot_num', 'Patient_count'], ascending=False)
否则,如果Patient_count = 2 将先前的1个No_Show乘以当前的No_show再除以阈值)
Example for B_ID = 3, Patient_count = 1, cut_off = 0.8/0.2 = 4
否则,如果Patient_count = 3 将先前的2个No_Show乘以当前的No_show并除以阈值
Example for B_ID = 4, Patient_count = 2, cut_off = (0.3*0.8)/0.2 = 1.2
依此类推
预期输出:
Example for B_ID = 8, Patient_count = 3, cut_off = (0.4*0.9*0.8)/0.2 = 1.44
答案 0 :(得分:3)
使用GroupBy.cumprod
并用probability
除以Series.div
:
probability = 0.2
df['new'] = df.groupby(['Session','slot_num'])['No_Show'].cumprod().div(probability)
print (df)
B_ID No_Show Session slot_num Patient_count new
0 1 0.2 S1 1 1 1.000
1 2 0.3 S1 2 1 1.500
2 3 0.8 S1 3 1 4.000
3 4 0.3 S1 3 2 1.200
4 5 0.6 S1 4 1 3.000
5 6 0.8 S1 5 1 4.000
6 7 0.9 S1 5 2 3.600
7 8 0.4 S1 5 3 1.440
8 9 0.6 S1 5 4 0.864
9 12 0.9 S2 1 1 4.500
10 13 0.5 S2 1 2 2.250
11 14 0.3 S2 2 1 1.500
12 15 0.7 S2 3 1 3.500
13 20 0.7 S2 4 1 3.500
14 16 0.6 S2 5 1 3.000
15 17 0.8 S2 5 2 2.400
16 19 0.3 S2 5 3 0.720