如何将TargetEncoder映射展平为DataFrame及替换分类值?
问题1:展平TargetEncoder的映射结果为目标DataFrame
先明确enc.mapping的结构:它是一个列表,每个元素对应一列的映射信息,包含列名col和该列的分类-目标值映射(通常是Series格式)。比如示例中的结构大致为:
[{'col': 'group1', 'mapping': pd.Series({'A1': 2.0, 'B1': 4.5}, name='group1')}, {'col': 'group2', 'mapping': pd.Series({'A2': 1.0, 'B2': 4.5, 'C2': 3.0}, name='group2')}]
要将其转换为包含group、cat_val、target_val三列的DataFrame,直接用列表推导式结合pd.concat即可实现:
import pandas as pd # 展平映射并拼接成DataFrame result_df = pd.concat( [pd.Series(m['mapping'], name='target_val') .rename_axis('cat_val') .reset_index() .assign(group=m['col']) for m in enc.mapping], ignore_index=True )[['group', 'cat_val', 'target_val']]
运行后就能得到符合要求的结构。
问题2:从ordinal_encoder.mapping提取原始分类值替换cat_val字段
假设enc.ordinal_encoder.mapping的结构是:每个元素包含列名col和分类-序数的映射字典,比如:
[{'col': 'group1', 'mapping': {'A1': 0, 'B1': 1}}, {'col': 'group2', 'mapping': {'A2': 0, 'B2': 1, 'C2': 2}}]
不需要按group分组替换,直接构建反向映射字典后批量替换即可,步骤如下:
1. 构建全局反向映射字典
reverse_mapping = {} for item in enc.ordinal_encoder.mapping: # 将原映射的键值反转:序数 -> 原始分类值 reverse_mapping[item['col']] = {v: k for k, v in item['mapping'].items()}
2. 替换DataFrame中的cat_val字段
假设待处理的DataFrame为target_df,包含group和cat_val列,用apply即可快速替换:
target_df['cat_val'] = target_df.apply( lambda row: reverse_mapping[row['group']][row['cat_val']], axis=1 )
如果数据量较大,用np.select效率更高:
import numpy as np conditions = [target_df['group'] == col for col in reverse_mapping.keys()] choices = [target_df['cat_val'].map(rev_map) for rev_map in reverse_mapping.values()] target_df['cat_val'] = np.select(conditions, choices)
这两种方式都比分组替换更简洁高效。
内容的提问来源于stack exchange,提问作者user6703592
相关产品推荐
相关产品推荐

