如何将DataFrame数值型weight列转为离散分类值用于后续独热编码
pandas连续值列转离散分类列实现方法
需求说明
处理DataFrame数据集时,需要将weight列的连续数值按固定规则映射为0/1/2三类离散值,方便后续执行独热编码,映射规则为:
- 数值小于90(计算式:173-83)映射为0
- 数值大于等于90、小于173映射为1
- 数值大于等于173映射为2
对应自定义判断逻辑参考:
def classificator(value): if value < (173-83): return 0 elif value < (173): return 1 else: return 2
实现方案
方案1:使用pandas内置cut函数(推荐,性能最优)
pd.cut是pandas专门用于连续值分箱的内置方法,执行效率远高于逐行遍历,适合各类数据量场景,逻辑和自定义规则完全对齐:
import pandas as pd # 定义分箱区间边界、对应分类标签 # right=False 表示区间为左闭右开,匹配 value < 阈值 的判断逻辑 bins = [-float("inf"), 173-83, 173, float("inf")] labels = [0, 1, 2] # 写法1:新增列存储分类结果(推荐,保留原始weight字段便于回溯校验) df["weight_cat"] = pd.cut(df["weight"], bins=bins, labels=labels, right=False).astype(int) # 写法2:直接替换原有weight列 # df["weight"] = pd.cut(df["weight"], bins=bins, labels=labels, right=False).astype(int)
转换完成后直接对分类列做独热编码即可,和gender这类原生分类列的处理效果完全一致,示例:
# 对分类后的weight列做one hot encode df = pd.get_dummies(df, columns=["weight_cat"], prefix="weight")
方案2:使用apply映射自定义函数
如果后续分类逻辑变复杂,无法通过简单分箱实现,可以直接用apply方法逐行调用写好的分类函数:
def classificator(value): if value < (173-83): return 0 elif value < (173): return 1 else: return 2 # 新增分类列 df["weight_cat"] = df["weight"].apply(classificator) # 替换原列 # df["weight"] = df["weight"].apply(classificator)
注意:如果
weight列存在空值,需要先做缺失值处理再执行转换,否则会触发判断逻辑报错。
内容的提问来源于stack exchange,提问作者Blackhole
相关产品推荐
相关产品推荐

