python - 如何根据仅应用于选定行的预定义百分比更改列的值
问题描述
我有一个数据框:
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)
解决方案
你可以做一个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
推荐阅读
- python - 遍历一系列以查找值 >= x 然后使用值
- jsp - 将属性从 jsp 传递到 servlet
- php - 如何为 chrome 或 firefox Offline 安装 xdebug 扩展?
- c# - Unity C# - 与圆柱体的碰撞球体 - 不触发圆柱体的侧面
- sql - T-SQL 交叉表计数查询
- python - 将过滤器应用于其父母循环内的孩子
- python - NLP - 检测单词含义的最佳/最准确方法是什么?
- scala - 来自 scala 的 gawk 命令在表达式错误中给出无效字符
- c++ - GLFW lambda 可以接受捕获参数吗?
- c - 如何多次使用没有标头保护的.h文件