You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

方法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)

运行后输出结果:

NameAgeSexBMISmokesResult
0Jordan26M26Nomedium risk
1Jess23F22Nolow risk
2Jake19M24Yeslow risk
3Alice20F17Nolow risk
4Alan24M35Yeshigh risk
5Lauren28F20Nolow 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)

你之前出错的常见原因

  1. 逻辑运算符优先级搞错:&的优先级比|高,所以必须给BMI≤19.99且吸烟这个子条件加括号,不然会先计算19.99 & Smokes,直接报错。
  2. apply没加axis=1:如果要同时处理多列,必须设置axis=1让函数接收整行数据,不然函数只会拿到单一列的值,无法同时判断两个字段。
  3. 条件顺序不对:高风险的条件优先级最高,要么先判断,要么最后赋值覆盖,不然会被其他低优先级的条件覆盖掉。

内容的提问来源于stack exchange,提问作者Annie.hut

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 07:25:15