如何对pandas DataFrame中含185+唯一值的字符串列执行独热编码
pandas Country列one-hot编码解决方案
方案1:全量直接编码
如果可以接受新增180+列的维度规模,直接用pandas内置get_dummies方法即可,代码如下:
import pandas as pd # 假设你的DataFrame变量名为df df_encoded = pd.get_dummies(df, columns=['Country'], dtype=int)
参数说明:dtype=int会将编码结果转为0/1整数格式,默认返回布尔值,整数格式更适配后续建模需求。
方案2:维度控制优化方案
如果担心180+的新增列带来维度爆炸问题,可以选择以下两种优化方式:
- 低频国家合并:仅保留高频国家,剩余低频国家统一归类为
Other后再编码,可自定义保留的国家数量:
# 统计每个国家的出现频次 country_cnt = df['Country'].value_counts() # 保留出现频次前150的国家,可根据需求调整数值 top_n_country = country_cnt.head(150).index # 替换低频国家为Other df['Country'] = df['Country'].apply(lambda x: x if x in top_n_country else 'Other') # 再执行one-hot编码,最终仅新增151列 df_encoded = pd.get_dummies(df, columns=['Country'], dtype=int)
- 稀疏矩阵存储:如果不需要降维又想节省内存,可以用sklearn的OneHotEncoder生成稀疏矩阵,适配绝大多数机器学习模型的输入要求:
import numpy as np from sklearn.preprocessing import OneHotEncoder # 初始化编码器,开启稀疏输出,用int8格式大幅降低内存占用 enc = OneHotEncoder(sparse_output=True, dtype=np.int8) # 拟合转换Country列 country_enc_sparse = enc.fit_transform(df[['Country']])
注意:如果数据需要拆分训练集和测试集,必须先完成数据集拆分,再用训练集的Country列拟合编码器,再分别转换训练集和测试集,禁止用全量数据拟合编码器,避免数据泄露。
内容的提问来源于stack exchange,提问作者Selva
相关产品推荐
相关产品推荐

