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

Python数据挖掘:心力衰竭数据集ID3决策树预处理中基于年龄分类MaxHR的代码问题

问题根源分析

你代码里的公式完全写反啦!正常最大心率的计算逻辑是220 - Age,但你写成了Age - 220——这个结果肯定是负数啊,比如40岁的话就是-180,而实际的MaxHR都是正数,自然所有记录都会满足(df['Age'] - 220) <= df['MaxHR']这个条件,所以全被改成'low'了。

正确的实现方法

这里有两种简洁靠谱的方式来实现你的需求:

方法一:使用apply函数逐行处理(可读性拉满)

这种方式逻辑直白,哪怕过几个月回头看也能一眼懂:

def categorize_maxhr(row):
    normal_maxhr = 220 - row['Age']
    if row['MaxHR'] < normal_maxhr:
        return 'low'
    elif row['MaxHR'] == normal_maxhr:
        return 'normal'
    else:
        return 'high'

df['MaxHR'] = df.apply(categorize_maxhr, axis=1)

方法二:使用loc批量赋值(大数据集更高效)

如果你的数据集规模很大,用loc的矢量操作会比逐行apply快很多:

# 先计算正常最大心率列(可选,方便调试和检查)
df['normal_maxhr'] = 220 - df['Age']

# 按逻辑依次赋值,顺序不影响但这样更清晰
df.loc[df['MaxHR'] > df['normal_maxhr'], 'MaxHR'] = 'high'
df.loc[df['MaxHR'] == df['normal_maxhr'], 'MaxHR'] = 'normal'
df.loc[df['MaxHR'] < df['normal_maxhr'], 'MaxHR'] = 'low'

# 如果不需要中间辅助列,可以删掉
# df.drop('normal_maxhr', axis=1, inplace=True)
验证示例

拿你举的例子测试:年龄40,MaxHR172,计算得normal_maxhr=220-40=180,172<180,所以会被设为'low',完全符合预期;如果MaxHR是180就会被标记为'normal',181的话就是'high'。

内容的提问来源于stack exchange,提问作者user

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 14:08:11