使用带自定义映射的ce.OrdinalEncoder调用inverse_transform报错如何解决
问题解决方法
报错根因
category_encoders库的OrdinalEncoder在执行逆转换时,要求传入的自定义映射规则为pandas.Series类型。你当前传入的是普通Python字典,字典不存在index属性,因此触发了AttributeError。
解决方案1:修改自定义映射格式
仅需将你定义的映射字典转为pd.Series类型即可兼容逆转换逻辑,修改后完整可运行代码如下:
import pandas as pd import category_encoders as ce lst = [ 'BRANCHING/ELONGATION', 'EARLY', 'EARLY', 'EARLY', 'EARLY', 'MID', 'MID', 'ADVANCED/TILLERING', 'FLOWERING', 'FLOWERING', 'FLOWERING', 'SEEDLING/EMERGED'] filtered_df = pd.DataFrame(lst, columns =['growth_state']) # 将映射规则转为pd.Series custom_mapping = [{'col': 'growth_state', 'mapping': pd.Series({'SEEDLING/EMERGED':0, 'EARLY':1, 'MID':2, 'ADVANCED/TILLERING':3, 'BRANCHING/ELONGATION':4, 'FLOWERING':5 })}] encoder = ce.OrdinalEncoder(cols = 'growth_state', mapping= custom_mapping) filtered_df['growth_state'] = encoder.fit_transform(filtered_df['growth_state']) # 逆转换可正常运行 newCol = encoder.inverse_transform(filtered_df['growth_state'])
解决方案2:使用sklearn自带OrdinalEncoder
如果不需要额外依赖category_encoders库,也可以直接使用sklearn原生的有序编码器,指定分类顺序即可实现相同效果:
import pandas as pd from sklearn.preprocessing import OrdinalEncoder lst = [ 'BRANCHING/ELONGATION', 'EARLY', 'EARLY', 'EARLY', 'EARLY', 'MID', 'MID', 'ADVANCED/TILLERING', 'FLOWERING', 'FLOWERING', 'FLOWERING', 'SEEDLING/EMERGED'] filtered_df = pd.DataFrame(lst, columns =['growth_state']) # 按业务逻辑指定分类的先后顺序 custom_order = [['SEEDLING/EMERGED', 'EARLY', 'MID', 'ADVANCED/TILLERING', 'BRANCHING/ELONGATION', 'FLOWERING']] encoder = OrdinalEncoder(categories=custom_order) # sklearn要求输入为二维数组,因此用两层方括号包裹列名 filtered_df['growth_state'] = encoder.fit_transform(filtered_df[['growth_state']]) # 逆转换 newCol = encoder.inverse_transform(filtered_df[['growth_state']])
内容的提问来源于stack exchange,提问作者Amit Tiwari
相关产品推荐
相关产品推荐

