【发布时间】: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