如何高效合并数据框c_name列低频类别并完成编码与合并?
解决方案
步骤1:统计类别频次,确定需保留的高出现率类别
先算出c_name列每个类别的出现次数,筛选出频次超过35的类别:
# 统计每个c_name的出现次数 c_name_counts = X_train['c_name'].value_counts() # 提取出现次数>35的类别列表 keep_categories = c_name_counts[c_name_counts > 35].index.tolist()
步骤2:将低频次类别统一替换为'Others'
把X_train里不在保留列表中的c_name全部替换成'Others',大数据集优先用np.where(比apply效率更高):
import numpy as np X_train['c_name'] = np.where(X_train['c_name'].isin(keep_categories), X_train['c_name'], 'Others')
步骤3:对处理后的列做One-Hot编码并合并
这里提供两种高效的实现方式:
方法1:用pandas直接生成编码(简单直观)
# 生成带前缀的one-hot编码列 c_name_onehot = pd.get_dummies(X_train['c_name'], prefix='c_name') # 合并编码列到原数据框,同时删除原c_name列避免冗余 X_train_encoded = pd.concat([X_train.drop('c_name', axis=1), c_name_onehot], axis=1)
方法2:用sklearn编码器(适合后续构建预处理流水线)
如果需要和其他预处理步骤整合,用这个更灵活:
from sklearn.preprocessing import OneHotEncoder from sklearn.compose import ColumnTransformer # 定义编码器:只处理c_name列,其他列保持不变 encoder = ColumnTransformer( transformers=[ ('onehot', OneHotEncoder(sparse_output=False, drop='first'), ['c_name']) ], remainder='passthrough' ) # 拟合并转换数据,得到编码后的数组 X_train_encoded_array = encoder.fit_transform(X_train) # 可选:转换回DataFrame方便查看和后续操作 X_train_encoded = pd.DataFrame( X_train_encoded_array, columns=encoder.get_feature_names_out() )
关键注意点
处理测试集(X_test)时,必须复用训练集得到的keep_categories,绝对不能用测试集自己的频次统计,避免数据泄露:
X_test['c_name'] = np.where(X_test['c_name'].isin(keep_categories), X_test['c_name'], 'Others') # 测试集编码用训练集拟合好的encoder(sklearn方法),或用get_dummies确保类别和训练集一致
内容的提问来源于stack exchange,提问作者ROHIT
相关产品推荐
相关产品推荐

