Pandas高基数installer变量如何批量合并非前三类为other
高基数分类变量Top类别自动保留+其余归集为other的实现方案
原有循环代码的核心问题
- 判断逻辑存在本质错误:循环内的
if unique != 'DWE' or unique != 'Government' or unique != 'RWE'条件永远为真。因为任意一个值不可能同时等于三个字符串,即便是目标保留的'DWE',判断时“不等于Government”这一项也会返回True,最终导致所有值都会被替换为'other',没有任何类别能被留下。 - 操作方式冗余:即便修正判断连接词为
and,依然是手动写死了需要保留的类别值,没有实现“自动取占比前三”的目标,和之前手动列值做replace的操作复杂度没有区别。 - 执行效率极低:两千多个类别的场景下,每循环一次就对全表做一次replace操作,大数据量下会出现明显卡顿。
可直接落地的实现步骤
全程不需要手动罗列需要替换的类别值,自动完成占比统计、Top类别筛选、剩余值合并的全流程:
- 自动提取占比排名前三的类别
直接调用pandas内置的占比统计方法,无需手动整理类别列表:
针对你给出的占比分布,这段代码会自动算出# 统计installer变量的类别占比,自动取Top3的类别名 top3_keep = df['installer'].value_counts(normalize=True).head(3).index.tolist()['DWE', 'Government', 'RWE']的结果,和手动列值的结果完全一致。 - 向量化完成剩余类别合并
替代逐值循环的低效操作,一次性完成全量数据的替换:import numpy as np df['installer'] = np.where( df['installer'].isin(top3_keep), # 判断是否属于需要保留的Top3类别 df['installer'], # 属于的话保留原值 'other' # 不属于的话统一替换为other )
复用说明
这套逻辑可以直接套用到你另一个高基数分类变量上,只需要替换对应列名即可,不需要重新统计类别、手动列值:
# 示例:处理另一个高基数变量,比如列名为'manufacturer' top3_other = df['manufacturer'].value_counts(normalize=True).head(3).index.tolist() df['manufacturer'] = np.where(df['manufacturer'].isin(top3_other), df['manufacturer'], 'other')
注意事项
- 如果需要保留原数据中的缺失值,可以在判断条件中追加非空校验,避免缺失值被误归集到'other'
- 如果需要保留的Top类别数量调整,只需要把
head(3)改成对应数字即可,核心逻辑不需要改动
内容的提问来源于stack exchange,提问作者LeLuc
相关产品推荐
相关产品推荐

