Pandas处理第二个DataFrame列替换低频值为Other时触发KeyError咨询
错误触发原因
- 变量
d是df1['column1'].value_counts() >= 50生成的布尔Series,它的索引仅覆盖df1该列出现过的所有唯一值:索引对应值为True表示是频次≥50的保留层级,False表示是df1里的低频层级。 - 处理df2时,列表推导式里写的
d[i]是按标签对Series做精确索引,只要df2的该列出现df1中从未存在过的新层级,这个标签就不在d的索引范围内,pandas会直接抛出KeyError。 - 哪怕df1里的低频值能通过
d[i]取到False,但完全没在df1里出现过的值没有对应的索引条目,无法完成判断,直接触发报错。
正确处理方式
不要用列表推导式直接索引Series,提前提取高频层级名单,用pandas原生的矢量化方法做判断,同时注意对齐两个DataFrame的category类别:
# 提取df1中符合频次要求的高频层级名单 high_freq = d[d].index.to_list() # 保留在高频名单内的值,其余全部替换为Other df2['column1'] = df2['column1'].where(df2['column1'].isin(high_freq), 'Other') # 转category类型,类别和df1处理后的列完全对齐 df2['column1'] = df2['column1'].astype('category').cat.set_categories(df1['column1'].cat.categories)
如果习惯用映射写法也可以用下面的代码,逻辑完全一致:
level_map = {v: v for v in high_freq} df2['column1'] = df2['column1'].map(level_map).fillna('Other') df2['column1'] = df2['column1'].astype('category').cat.set_categories(df1['column1'].cat.categories)
注意:如果转category时不做类别对齐,df2的列类别集合可能和df1不一致,后续做独热编码、表拼接操作时会出现字段错位、维度不匹配的问题,必须以处理完的df1的类别列表为统一标准。
内容的提问来源于stack exchange,提问作者screechOwl
相关产品推荐
相关产品推荐

