在我的数据集上,我有许多列,其中包含分类和数值的混合值。基本上,当数值不可用时,将分配一个与丢失原因相关的代码,例如“ 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?我必须从头开始编写,还是有一些通用库提供的技巧来对列的子集进行热编码,例如['a','b','else']?

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

最佳答案

这是一个潜在的解决方案。首先使用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

关于python - 仅对列的某些元素进行热编码,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60002875/

10-09 03:03