根据groupby或大熊猫中的循环条件划分列

时间:2020-04-07 12:09:36

标签: pandas pandas-groupby

我有一个如下所示的数据框

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

1 个答案:

答案 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