首页 > 解决方案 > 如何根据仅应用于选定行的预定义百分比更改列的值

问题描述

我有一个数据框:

df = pd.DataFrame({'cust_id':['a1','a2','a3','a4','a5','a6'], 'pd':[0.6,0.26,0.94,0.44,0.65,0.88]})
df
    cust_id    pd
0      a1     0.60
1      a2     0.26
2      a3     0.99
3      a4     0.44
4      a5     0.65
5      a6     0.88

我想根据我定义为的类别震惊 pd 列:

def pd_cat(n):
    if n < 0.2:
        return '1'
    elif n >=0.2 and n < 0.4:
        return '2'
    elif n >=0.4 and n < 0.6:
        return '3'
    elif n >=0.6 and n < 0.8:
        return '4'
    else:
        return '5'



df['pd_risk_cat'] =  df['pd'].apply(lambda x: pd_cat(x))

df
    cust_id    pd    pd_cat
0      a1     0.60    4
1      a2     0.26    2
2      a3     0.99    5
3      a4     0.44    3
4      a5     0.65    4
5      a6     0.88    5

然后我根据 pd_cat 创建一个映射来冲击 pd 值:

cat_map={'1':1.1, '2':1.2, '3':1.3,'4':1.4,'5':1.5}
df["pd_stressed"]=df["pd"].mul(df["pd_cat"].map(cat_map))

但我只想将 cat_map 应用于 pd<0.7 并且如果 >=0.7 的行,则该值与原始 pd 值保持相同。

我怎样才能做到这一点?

预期输出:

df
    cust_id    pd    pd_cat  pd_stressed
0      a1     0.60    4       0.84
1      a2     0.26    2       0.312
2      a3     0.99    5       0.99 (sames as original pd value)
3      a4     0.44    3       0.572
4      a5     0.65    4       0.91
5      a6     0.88    5       0.88 (sames as original pd value)

标签: pythonpandas

解决方案


你可以做一个series.mask

df["pd_stressed"] = df['pd'].mask(df['pd'].lt(0.9),
                    df["pd"].mul(df["pd_risk_cat"].map(cat_map)))
print(df)

        cust_id    pd pd_risk_cat  pd_stressed
0      a1  0.60           4        0.840
1      a2  0.26           2        0.312
2      a3  0.94           5        0.940   <- This value remains same since  >= 0.9
3      a4  0.44           3        0.572
4      a5  0.65           4        0.910
5      a6  0.88           5        1.320

推荐阅读