在我的数据集上,我有许多列,其中包含分类和数值的混合值。基本上,当数值不可用时,将分配一个与丢失原因相关的代码,例如“ 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_dummies
和pandas.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/