首页 > 解决方案 > 在分类特征中结合低频率的水平

问题描述

我正在尝试在具有 315 个级别的分类特征中组合级别。
我查找每个级别的频率的代码是:

for feature in categorical:
   percentage = df[feature].value_counts()/len(df)*100
   print("Feature {}: \n{}".format(feature,percentage))

当“分类”时,它是一个包含数据集中所有分类特征的列表。
我可以看到“Feature_13”包括 315 个级别,其中大部分的频率低于 0.01。

如何有效地结合低频水平?

标签: pythonpandas

解决方案


假设您要删除频率(不是实际值)小于 0.01 的那些。

for feature in categorical:
  df[feature] = df[feature].mask(df[feature].map(df[feature].value_counts(normalize=True)) < 0.01, 'Other')

如您所知,df[feature].value_counts(normalize=True)返回一个系列。然后,方法map使用这个系列作为字典,将单元格值映射到相应的频率。有了这个条件< 0.01,我们就可以筛选出频率小于0.01的那些。最后,函数mask有助于将这些有效单元格的值转换为“其他”。

如果您想知道将稀有分类值分组到单个集合中的阈值应该是多少,这里是示例。假设我们想要对包含频率分布的较低 10% 的稀有分类值进行分组。

frequencies = df[feature].value_counts(normalize=True, ascending=True)
threshold = frequencies[(frequencies.cumsum() > 0.1).idxmax()]

推荐阅读