此编码过程将生成分类值与其数值之间的映射:
import category_encoders as ce
cols_a = ['group1', 'group2']
dfa = pd.DataFrame([['A1', 'A2', 1], ['B1', 'B2', 4], ['A1', 'C2', 3], ['B1', 'B2', 5]], columns=['group1', 'group2', 'label'])
enc = ce.TargetEncoder(cols=cols_a)
enc.fit(dfa[cols_a], dfa['label'])
enc.mapping
也许你可以忽略编码过程,只记住输出映射。
如何将此映射展平到下面的预期数据框?
跟进:我最终想将 'cat_val' 替换为映射
enc.ordinal_encoder.mapping
中的原始分类值。有什么简单的方法可以实现吗?
我的解决方案是groupby 'group' -> 找到对应的字典 -> 替换为字典的值
这是一种方法:
第 1 步: 将
enc.mapping
转换为 df
pd.concat
与 names
+ df.reset_index
与 name
:
names = ['group', 'cat_val']
enc_mapping = (pd.concat(enc.mapping, names=names)
.reset_index(name='value')
)
输出:
group cat_val value
0 group1 1 3.072686
1 group1 2 3.427314
2 group1 -1 3.250000
3 group1 -2 3.250000
4 group2 1 2.957256
5 group2 2 3.427314
6 group2 3 3.217473
7 group2 -1 3.250000
8 group2 -2 3.250000
第2步:基于
enc.ordinal_encoder.mapping
的地图
m = (pd.concat({item['col']: pd.Series(item['mapping'].index, item['mapping'])
for item in enc.ordinal_encoder.mapping})
)
enc_mapping['cat_val'] = enc_mapping.set_index(names).index.map(m)
# alternative:
# enc_mapping['cat_val'] = enc_mapping[names].apply(tuple, axis=1).map(m)
输出:
group cat_val value
0 group1 A1 3.072686
1 group1 B1 3.427314
2 group1 NaN 3.250000
3 group1 NaN 3.250000
4 group2 A2 2.957256
5 group2 B2 3.427314
6 group2 C2 3.217473
7 group2 NaN 3.250000
8 group2 NaN 3.250000
说明/中间体
'col'
中每个字典中的 enc.ordinal_encoder.mapping
键获取键并从 'mapping'
获取值,但交换索引和值(参见 here)。将此传递给pd.concat
:m
group1 1 A1
2 B1
-2 NaN
group2 1 A2
2 B2
3 C2
-2 NaN
dtype: object
enc_mapping
将 names
的索引设置为
df.set_index
,使用 index.map
应用
m
,然后进行分配。(在第 2 步:我可以想象有一种更简单的方法来获取代码映射。通过
enc.ordinal_encoder.transform(dfa[cols_a])
可能很有希望。)