如何一次性对多分类变量(20-400唯一值)执行Top10独热编码?
批量处理分类变量Top10独热编码并输出单个文件
问题背景
现有Person_details.csv数据集,包含507列(7个分类变量、500个数值变量)和5万行数据。每个分类变量的唯一值在20-400之间,直接独热编码会导致特征空间过大,因此选择对每个分类变量取Top10高频唯一值进行编码。当前需手动逐个处理分类变量并保存到不同文件,希望实现批量处理并输出单个合并文件。
解决方案代码
import pandas as pd import numpy as np # 定义批量处理TopN编码的通用函数 def encode_top_n(df, variable, top_n=10): # 获取该变量的TopN高频标签 top_labels = df[variable].value_counts().sort_values(ascending=False).head(top_n).index.tolist() # 为每个Top标签生成独热编码列 for label in top_labels: df[f"{variable}_{label}"] = np.where(df[variable] == label, 1, 0) # 可选:若不需要保留原始分类列,可取消下面注释 # df.drop(variable, axis=1, inplace=True) return df # 1. 读取完整数据集(包含所有数值与分类变量) full_df = pd.read_csv("Person_details.csv") # 2. 定义需要处理的分类变量列表 categorical_vars = ['FirstRace','Languages', 'Ethnicity', 'City', 'Country', 'Month','Field'] # 3. 循环处理所有分类变量,生成编码列 for var in categorical_vars: full_df = encode_top_n(full_df, var, top_n=10) # 4. 保存最终合并后的文件 full_df.to_csv("Person_details_encoded.csv", index=False)
关键改进说明
- 通用函数封装:
encode_top_n函数可复用处理任意分类变量,自动生成TopN标签的编码列,避免重复编写相同逻辑 - 批量循环处理:直接遍历7个分类变量列表,一次性完成所有编码操作,无需手动替换变量名
- 全量数据合并:直接在原始数据集上生成编码列,无需拆分保存后再合并,减少IO操作和出错概率
- 灵活可调:可通过修改
top_n参数调整保留的高频标签数量,也可选择删除原始分类列(注释部分)
注意事项
- 未进入Top10的类别会被所有编码列标记为0,不会生成额外列,有效控制特征空间规模
- 最终数据集包含500个数值变量+7*10=70个编码列,总列数约570,不会出现特征爆炸问题
- 5万行数据在普通机器上可直接加载,若内存紧张可拆分分块处理
内容的提问来源于stack exchange,提问作者Shourya
相关产品推荐
相关产品推荐

