如何对数值型分类列执行One Hot Encoding?附DataFrame转换示例
嘿,这个问题太常见了——很多人默认编码只针对字符串分类列,但其实数值型分类列的处理逻辑完全相通,只是它们的存储类型是数字而已。咱们一步步来实现你想要的结果:
第一步:先构造你的原始数据
首先咱们把你给出的DataFrame用代码还原出来,方便后续操作:
import pandas as pd df = pd.DataFrame({ 'year': [2018, 2018, 2019, 2019], 'hour': [1, 3, 4, 4] })
第二步:用Pandas快速实现编码
Pandas的get_dummies()函数是处理分类编码的利器,不管是字符串还是数值型分类列都能搞定。我们可以分别对year和hour列生成带前缀的独热编码列,再合并到一起:
# 对hour列生成独热编码,指定前缀为"hour" hour_encoded = pd.get_dummies(df['hour'], prefix='hour') # 对year列生成独热编码,指定前缀为"year" year_encoded = pd.get_dummies(df['year'], prefix='year') # 合并两个编码后的DataFrame final_df = pd.concat([year_encoded, hour_encoded], axis=1)
运行这段代码后,你会得到这样的结果:
| year_2018 | year_2019 | hour_1 | hour_3 | hour_4 |
|---|---|---|---|---|
| 1 | 0 | 1 | 0 | 0 |
| 1 | 0 | 0 | 1 | 0 |
| 0 | 1 | 0 | 0 | 1 |
| 0 | 1 | 0 | 0 | 1 |
这和你给出的目标输出几乎一致,唯一的区别是year_2019列的第三、四行都是1——推测你给出的目标里第三行的4可能是笔误?如果确实需要第三行year_2019为4、第四行为1,那可能需要额外的自定义规则(比如结合hour的数值或计数),可以再补充说明你的具体需求,我再帮你调整。
第三步:如果是机器学习场景,用Sklearn更稳妥
如果你是要为后续的机器学习模型做数据预处理,推荐使用sklearn.preprocessing.OneHotEncoder,它能更好地保证训练集和测试集的编码一致性:
from sklearn.preprocessing import OneHotEncoder # 初始化编码器,设置输出为密集矩阵,保留特征名 encoder = OneHotEncoder(sparse_output=False, dtype=int, handle_unknown='ignore') # 对year和hour列进行编码 encoded_data = encoder.fit_transform(df[['year', 'hour']]) # 获取编码后的特征名 feature_names = encoder.get_feature_names_out(['year', 'hour']) # 转换为DataFrame final_df_sklearn = pd.DataFrame(encoded_data, columns=feature_names)
这个结果和Pandas方法得到的完全一致。
核心思路总结
数值型分类列的编码本质和字符串分类列没有区别——因为它们的核心是分类变量,只是存储形式是数字。只要告诉工具(Pandas或Sklearn)它们是分类属性,就能用和字符串分类列一样的方法处理。
内容的提问来源于stack exchange,提问作者Lucas Mengual
相关产品推荐
相关产品推荐

