将带有数据帧值的字典压平到数据帧

问题描述 投票:0回答:1

此编码过程将生成分类值与其数值之间的映射:

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

enter image description here

也许你可以忽略编码过程,只记住输出映射。

如何将此映射展平到下面的预期数据框?

enter image description here

跟进:我最终想将 'cat_val' 替换为映射

enc.ordinal_encoder.mapping
中的原始分类值。有什么简单的方法可以实现吗?

我的解决方案是groupby 'group' -> 找到对应的字典 -> 替换为字典的值

enter image description here

dataframe dictionary mapping
1个回答
0
投票

这是一种方法:

第 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

(在第 2 步:我可以想象有一种更简单的方法来获取代码映射。通过

enc.ordinal_encoder.transform(dfa[cols_a])
可能很有希望。)

© www.soinside.com 2019 - 2024. All rights reserved.