gpt4 book ai didi

python - 仅对列的某些元素进行热编码

转载 作者:行者123 更新时间:2023-12-01 06:28:49 25 4
gpt4 key购买 nike

在我的数据集中,我有许多包含混合分类值和数值的列。基本上,当数值不可用时,会分配一个代码,如“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 之类的东西?我必须从头开始编写,或者公共(public)库中有一个黑客可以对列的子集进行热编码,例如 ['a', 'b', 'else'] ?

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

最佳答案

这是一种可能的解决方案。首先使用 str.isdigit 创建一个 bool 掩码。使用pandas.get_dummiespandas.concat对于您的最终数据框:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com