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
相关产品推荐
相关产品推荐

