我有 df 如下所示
ID Age_days N_30 N_31_90 N_91_180 N_180_365
1 201 60 15 30 1
2 800 0 15 5 10
3 800 0 0 10 6
4 100 0 0 0 370
5 600 0 6 5 10
6 800 0 0 15 6
7 500 10 10 30 9
8 200 0 0 0 0
9 500 0 0 0 0
从上面df
我想派生一个名为Recency
解释:
if df['N_30'] != 0, then Recency = (30/df['N_30'])
elif df['N_31_90'] != 0 then Recency = 30 + (60/df['N_31_90'])
elif df['N_91_180'] != 0 then Recency = 90 + (90/df['N_91_180'])
elif df['N_181_365'] != 0 then Recency = 180 + (185/df['N_181_365'])
else
if df['age_days'] <= 365, Recency = df['age_days']
else Recency = 366
预期输出:
ID Limit N_30 N_31_90 N_91_180 N_180_365 Recency
1 201 60 15 30 1 (30/60) = 0.5
2 800 0 15 5 10 30+(60/15) = 34
3 800 0 0 10 6 90+90/10 = 100
4 100 0 0 0 370 180+(185/370) = 180.5
5 600 0 6 5 10 30+(60/6) = 36
6 800 0 0 15 6 90+(90/15) = 96
7 500 10 10 30 9 30/10 = 3
8 200 0 0 0 0 200
9 500 0 0 0 0 366
我尝试了下面的代码
pd.set_option("use_inf_as_na", True)
df2 = df[['N_30', 'N_31_90', 'N_91_180', 'N_180_365']]
df["Recency"] = (df2.eq(0) * [30, 60, 90, 180]).sum(1) + ([30, 60, 90, 185] / df2).bfill(1).iloc[:, 0]
df["Recency"].fillna(366)