如何在Python中对高基数变量按占比自动生成哑编码?
针对高占比类别生成哑编码的实现方案
当然可以只对占比≥2%的类别生成哑编码,先确认下符合条件的类别:总数据16494条,2%对应的阈值约为330条,你给出的统计里,USD(13695)、GBP(558)、EUR(406)都远超这个阈值,INR、CAD等小类别则不符合。
下面是具体的实现步骤(以Python Pandas为例):
- 筛选符合占比要求的类别
import pandas as pd # 假设你的数据集存储在df中 # 计算各币种的占比(百分比) currency_proportions = df['salary_currency'].value_counts(normalize=True) * 100 # 提取占比≥2%的币种列表 target_currencies = currency_proportions[currency_proportions >= 2].index.tolist()
- 生成目标类别的哑编码
有两种常见处理方式:
- 方式一:将小类别统一归为Other,再生成包含Other的哑编码
这种方式能完整保留所有样本的信息,同时避免维度冗余:
# 新建列,把非目标币种替换为Other df['salary_currency_grouped'] = df['salary_currency'].apply( lambda x: x if x in target_currencies else 'Other' ) # 生成哑编码,drop_first=True可避免多重共线性问题 currency_dummies = pd.get_dummies(df['salary_currency_grouped'], prefix='currency', drop_first=True) # 将哑编码合并到原数据集 df = pd.concat([df, currency_dummies], axis=1)
- 方式二:仅为目标类别生成哑编码,小类别对应的哑编码列全为0
这种方式不会新增Other类别,适合不需要保留小类别信息的场景:
# 生成所有币种的哑编码后,只保留目标类别对应的列 currency_dummies = pd.get_dummies(df['salary_currency'], prefix='currency').filter( [f'currency_{curr}' for curr in target_currencies] ) # 合并到原数据集 df = pd.concat([df, currency_dummies], axis=1)
这样处理后,你就只得到了USD、GBP、EUR(或包含Other)的哑编码列,既精简了特征维度,又保留了主要类别的信息。
内容的提问来源于stack exchange,提问作者Englishman Bob
相关产品推荐
相关产品推荐

