如何将 'other' 分配给低频类别? (pandas)

How do I assign 'other' to low frequency categories? (pandas)

我有一个 'city' 列,其中包含 1000 多个唯一条目。 (由于某种原因,这些条目是整数,当前指定为浮点类型。)

我尝试 df['city'].value_counts()/len(df) 获取他们的频率。它返回了 table。前几个值是0.12,.4,.4,.3.....

我完全是初学者,所以我不确定如何使用此信息将所有内容分配给 'other',例如最后 10 个百分位数。

我想将独特的城市值从 1000 减少到大约 10,这样我以后可以在上面使用 get_dummies

让我们看一下预期操作的逻辑:

  1. 计算每个城市的频率
  2. 计算最后 10% 的百分比
  3. 查找频率小于 10% 的城市
  4. 将它们更改为其他

您的起点是正确的。要获取每个城市的频率:

city_freq = (df['city'].value_counts())/df.shape[0]

我们想找到最后的 10%。我们用pandas'quantile来做:

bottom_decile = city_freq.quantile(q=0.1)

现在 bottom_decile 是一个浮点数,表示与其余部分相差底部 10% 的数字。频率低于10%的城市:

less_freq_cities = city_freq[city_freq<=botton_decile]

less_freq_cities 将保留城市条目。如果你想将它们在 'df' 中的值更改为 "other":

df.loc[df["city"].isin(less_freq_cities.index.tolist())] = "other"

完整代码:

city_freq = (df['city'].value_counts())/df.shape[0]
botton_decile = city_freq.quantile(q=0.1)
less_freq_cities = city_freq[city_freq<=botton_decile]
df.loc[df["city"].isin(less_freq_cities.index.tolist())] = "other"

这就是您将 10%(或任何您想要的,只需更改 quantile 中的 q 参数)替换为您选择的值的方法。

编辑: 正如评论中所建议的那样,为了获得归一化的频率,最好使用 city_freq = df['city'].value_counts(normalize=True) 而不是按形状划分。但实际上,我们不需要归一化频率。 pandas' qunatile 将起作用,即使它们未被归一化。我们可以用: city_freq = df['city'].value_counts() 它仍然有效。