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

如何对数值型分类列执行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_2018year_2019hour_1hour_3hour_4
10100
10010
01001
01001

这和你给出的目标输出几乎一致,唯一的区别是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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:39:53