使用 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 编码后在列中显示特征名称的主要内容,如果未能解决你的问题,请参考以下文章