如何在Pandas DataFrame的If Elif Else中合并BMI与吸烟风险判断条件
解决Pandas合并BMI与吸烟状态的风险判断问题
明确判定逻辑
你需要的高风险规则是:
- BMI ≥ 30,或者BMI ≤ 19.99 且 吸烟(Smokes='Yes') → 标记为
high risk - 其余情况按原BMI分级:
- 25 ≤ BMI ≤ 29.99 →
medium risk - 剩下的情况 →
low risk
- 25 ≤ BMI ≤ 29.99 →
方法1:用apply逐行处理多列
修改判断函数,让它同时接收BMI和吸烟状态两个字段,通过axis=1让apply遍历每一行数据:
import pandas as pd df = pd.DataFrame({ 'Name': ['Jordan', 'Jess', 'Jake', 'Alice', 'Alan', 'Lauren'], 'Age': [26, 23, 19, 20, 24, 28], 'Sex': ['M', 'F', 'M', 'F', 'M', 'F'], 'BMI': [26, 22, 24, 17, 35, 20], 'Smokes': ['No', 'No', 'Yes', 'No', 'Yes', 'No'] }) def assign_result(row): # 先判断高风险的合并条件 if (row['BMI'] >= 30) or (row['BMI'] <= 19.99 and row['Smokes'] == 'Yes'): return 'high risk' # 再判断中等风险 elif 25 <= row['BMI'] <= 29.99: return 'medium risk' # 其余为低风险 else: return 'low risk' df['Result'] = df.apply(assign_result, axis=1) display(df)
运行后输出结果:
| Name | Age | Sex | BMI | Smokes | Result | |
|---|---|---|---|---|---|---|
| 0 | Jordan | 26 | M | 26 | No | medium risk |
| 1 | Jess | 23 | F | 22 | No | low risk |
| 2 | Jake | 19 | M | 24 | Yes | low risk |
| 3 | Alice | 20 | F | 17 | No | low risk |
| 4 | Alan | 24 | M | 35 | Yes | high risk |
| 5 | Lauren | 28 | F | 20 | No | low risk |
方法2:用Pandas原生矢量化操作(更高效)
如果你的数据量很大,apply的效率会偏低,推荐用Pandas的矢量化条件赋值,速度更快:
import pandas as pd import numpy as np df = pd.DataFrame({ 'Name': ['Jordan', 'Jess', 'Jake', 'Alice', 'Alan', 'Lauren'], 'Age': [26, 23, 19, 20, 24, 28], 'Sex': ['M', 'F', 'M', 'F', 'M', 'F'], 'BMI': [26, 22, 24, 17, 35, 20], 'Smokes': ['No', 'No', 'Yes', 'No', 'Yes', 'No'] }) # 先默认标记为低风险 df['Result'] = 'low risk' # 标记中等风险的行 df.loc[(df['BMI'] >= 25) & (df['BMI'] <= 29.99), 'Result'] = 'medium risk' # 标记高风险的行(优先级最高,会覆盖之前的标记) high_risk_mask = (df['BMI'] >= 30) | ((df['BMI'] <= 19.99) & (df['Smokes'] == 'Yes')) df.loc[high_risk_mask, 'Result'] = 'high risk' display(df)
你之前出错的常见原因
- 逻辑运算符优先级搞错:
&的优先级比|高,所以必须给BMI≤19.99且吸烟这个子条件加括号,不然会先计算19.99 & Smokes,直接报错。 - apply没加
axis=1:如果要同时处理多列,必须设置axis=1让函数接收整行数据,不然函数只会拿到单一列的值,无法同时判断两个字段。 - 条件顺序不对:高风险的条件优先级最高,要么先判断,要么最后赋值覆盖,不然会被其他低优先级的条件覆盖掉。
内容的提问来源于stack exchange,提问作者Annie.hut
相关产品推荐
相关产品推荐

