【问题标题】:Hot-Encoding only on some elements of a column仅对列的某些元素进行热编码
【发布时间】:2020-01-31 11:19:07
【问题描述】:

在我的数据集上,我有许多包含混合分类值和数值的列。基本上,当数值不可用时,会分配一个代码,例如“M”、“C”等。与丢失的原因相关联。
它们具有特殊的含义和特殊的行为,因此我想将它们转换为分类,并将其余部分保留为数字。 最小的例子:

# Original df
ex1 = ['a', 'b', '0', '1', '2']
df = pd.DataFrame(ex1, columns=['CName'])
print(df)

CName
0     a
1     b
2     0
3     1
4     2

## What I want to achieve
df['CName_a'] = (df.CName == 'a').astype(int)
df['CName_b'] = (df.CName == 'b').astype(int)
ff = (df.CName == 'b') | (df.CName == 'a')
df['CNname_num'] = np.where(ff, np.NaN, df.CName)
df2 = df.drop('CName', axis=1)
print(df2)

   CName_a  CName_b CNname_num
0        1        0        NaN
1        0        1        NaN
2        0        0          0
3        0        0          1
4        0        0          2

问题 1
Q1:如何有效地做到这一点?理想情况下,我需要将它链接在管道中,一些 fit_transform 之类的东西?我必须从头开始编写,否则公共库中有一个 hack 可以对列的子集进行热编码,例如 ['a', 'b', 'else']?

问题 2
Q2:CName_num 的“Nan”应该如何填写?分类元素(示例中的“a”和“b”)具有不同于数值平均值(实际上与任何数值)的行为。我觉得分配 0 或 'mean' 不是正确的选择,但我没有选择。如果表现不错,我计划使用随机森林、DNN 甚至是类似回归的训练。

【问题讨论】:

    标签: python pandas feature-extraction categorical-data one-hot-encoding


    【解决方案1】:

    这是一种可能的解决方案。首先使用str.isdigit 创建一个布尔掩码。使用 pandas.get_dummiespandas.concat 作为最终的 DataFrame:

    mask = mask = df['CName'].str.isdigit()
    
    pd.concat([pd.get_dummies(df.loc[~mask, 'CName'], prefix='CName')
                 .reindex(df.index).fillna(0),
               df.loc[mask].add_suffix('_num')], axis=1)
    

    [出]

       CName_a  CName_b CName_num
    0      1.0      0.0       NaN
    1      0.0      1.0       NaN
    2      0.0      0.0         0
    3      0.0      0.0         1
    4      0.0      0.0         2
    

    【讨论】:

    • @jezrael 啊,谢谢,这样更好。会更新
    猜你喜欢
    • 1970-01-01
    • 2022-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-27
    • 2018-06-29
    • 2016-06-27
    • 1970-01-01
    相关资源
    最近更新 更多