使用 One Hot 编码后在列中显示特征名称

Posted

技术标签:

【中文标题】使用 One Hot 编码后在列中显示特征名称【英文标题】:Display feature names in columns after using One Hot encoding 【发布时间】:2020-10-25 02:59:22 【问题描述】:

我在 csv 中有一列是我想要转换为数组的水果的名称。

示例 csv 列:

Names:
Apple
Banana
Pear
Watermelom
Jackfruit
..
..
..

列中有大约 400 个水果名称

我使用了一种热编码,但无法显示列名(csv 列的一行中的每个水果名称)

到目前为止我的代码是:

import pandas as pd
from sklearn.preprocessing import LabelEncoder, OneHotEncoder

dataset = pd.read_csv('D:/fruits.csv')
X= dataset.iloc[:, 0].values


labelencoder_X = LabelEncoder()
D= labelencoder_X.fit_transform(X)
D = D.reshape(-1, 1)

onehotencoder = OneHotEncoder(sparse=False, categorical_features = [0])
X = onehotencoder.fit_transform(D)

这会将列的数据转换为 numpy 数组,但列名称为 [0 1 2 3 .. ..] 我希望作为 csv 的每一行名称,例如 [Apple Banana Pear Watermelon .. ..]

使用一种热编码后如何保留列名

【问题讨论】:

你能添加你当前的输出和想要的输出吗? .values 将数据框更改为不支持字符串列名的 numpy 数组。你可以试试X = pd.DataFrame(X, columns = dataset.columns) @SachinPrabhu 我收到错误“ValueError:传递值的形状为 (1, 68197),索引暗示 (3, 68197)” 这能回答你的问题吗? Feature names from OneHotEncoder 【参考方案1】:

原答案:

OneHotEncode 的一种相当有效的方法是使用pd.get_dummies。 我已经申请了样本数据:

data = 'Names':['Apple','Banana','Pear', 'Watermelon']
df = pd.DataFrame(data=data)

df_new = pd.get_dummies(df)
print(df_new) 

原始df:

        Names
0       Apple
1      Banana
2        Pear
3  Watermelon

编码的df:

   Names_Apple  Names_Banana  Names_Pear  Names_Watermelon
0            1             0           0                 0
1            0             1           0                 0
2            0             0           1                 0
3            0             0           0                 1

编辑:

假设我们的数据框包含 2 个分类和 2 个数字特征。我们只想对 2 个分类列中的 1 个进行 OneHotEncode。

生成虚拟数据:

data = 'Names':['Apple','Banana','Pear', 'Watermelom'],
        'Category' :['A','B','A','B'],
        'Val1':[10,20,30,30],
        'Val2':[60,70,80,90]
df = pd.DataFrame(data=data)

        Names Category  Val1  Val2
0       Apple        A    10    60
1      Banana        B    20    70
2        Pear        A    30    80
3  Watermelom        B    30    90

如果我们只想 OneHotEncode Names 我们会这样做

df_new = pd.get_dummies(df, columns=['Names'])
print(df_new)

您可以参考这个documentation。通过定义columns,我们将只对感兴趣的列进行编码。

编码输出:

  Category  Val1  Val2  Names_Apple  Names_Banana  Names_Pear  Names_Watermelom
0        A    10    60            1             0           0                 0
1        B    20    70            0             1           0                 0
2        A    30    80            0             0           1                 0
3        B    30    90            0             0           0                 1

【讨论】:

嗨弗尔坎。我不能像那样手动创建数据变量,因为 Names 列下大约有 400 个项目。关于如何解决这个问题的任何建议? 如果 400 个项目在 pandas 数据框的列中,则上面的代码应该可以工作。您是否尝试过解决方案中的代码? 我怀疑data = 'Names':['Apple','Banana','Pear', 'Watermelon'] 仅包含 4 项,但它应该包含 csv 列中的 400 个水果名称。 我假设您正在阅读您命名为数据集的 csv。用数据集替换最后第二行代码中的 df。我创建数据只是为了展示一个示例。 让我试试。另外,我最初在 csv 中有 3 列,但我只想将 1 列转换为数组,即 Names 列。 data= pd.read_csv('D:/fruits.csv') data = data[:, 0] df = pd.DataFrame(data=data) 在这种情况下,我收到错误“TypeError: unhashable type: 'slice'”

以上是关于使用 One Hot 编码后在列中显示特征名称的主要内容,如果未能解决你的问题,请参考以下文章

为啥要用one-hot编码

one-hot code 独热编码

详解 one-hot 和 TF-IDF

连续型特征的归一化和离散特征的one-hot编码

one-hot编码简介

One-hot与Word2Vec