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

如何高效合并数据框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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 17:45:06