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

Display feature names in columns after using One Hot encoding

我在 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 .. ..]

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

原答案:

一种相当有效的 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