如何在 Python 中对数据框列进行一次热编码?
Posted
技术标签:
【中文标题】如何在 Python 中对数据框列进行一次热编码?【英文标题】:How to One Hot Encode a Dataframe Column in Python? 【发布时间】:2021-11-16 23:35:50 【问题描述】:我正在尝试使用此代码使用 One Hot Encoder 转换列 Dataframe。
from sklearn.preprocessing import OneHotEncoder
df['label'] = OneHotEncoder().fit(df['label']).toarray()
这是回溯
ValueError: Expected 2D array, got 1D array instead:
array=['Label1' 'Label1' 'Label1' 'Label1' 'Label1'
'Label1' 'Label1' 'Label1' 'Label1' 'Label1'
'Label2' 'Label2' 'Label2' 'Label2' 'Label2' 'Label2' 'Label2'
'Label2' 'Label2' 'Label2' 'Label3' 'Label3' 'Label3' 'Label3' 'Label3' 'Label3'
'Label3' 'Label3' 'Label3' 'Label3' 'Label4' 'Label4' 'Label4' 'Label4' 'Label4' 'Label4'
'Label4' 'Label4' 'Label4' 'Label4' 'Label5' 'Label5' 'Label5'
'Label5' 'Label5' 'Label5' 'Label5' 'Label5'
'Label5' 'Label5' 'Label6' 'Label6' 'Label6'
'Label6' 'Label6' 'Label6' 'Label6' 'Label6'
'Label6' 'Label6' 'Label7' 'Label7' 'Label7'
'Label7' 'Label7' 'Label7' 'Label7' 'Label7'
'Label7' 'Label7' 'Label8' 'Label8' 'Label8' 'Label8' 'Label8'
'Label8' 'Label8' 'Label8' 'Label8' 'Label8' 'Label9' 'Label9'
'Label9' 'Label9' 'Label9' 'Label9' 'Label9' 'Label9'
'Label9' 'Label9' 'Label10' 'Label10' 'Label10' 'Label10' 'Label10'
'Label10' 'Label10' 'Label10' 'Label10' 'Label10' 'Label11' 'Label11'
'Label11' 'Label11' 'Label11' 'Label11' 'Label11' 'Label11' 'Label11' 'Label11'
'Label12' 'Label12' 'Label12' 'Label12' 'Label12' 'Label12'
'Label12' 'Label12' 'Label12' 'Label12'].
Reshape your data either using array.reshape(-1, 1) if your data has a single feature or
array.reshape(1, -1) if it contains a single sample.
我已经尝试过重塑,但回溯是一个系列没有属性重塑。使用 One Hot Encoder 的解决方法是什么?
【问题讨论】:
我不知道OneHotEncoder
API,但试试这个:df = pd.get_dummies(data = df, columns = ['label'])
。这会给你同样的结果。
这是一个重复的问题,这种类型的问题每周都会在 Stack Overflow 上提出,所以也要检查一下。
对不起,这是一个重复的问题。我只找到了 pd.get_dummies 的解决方案,我想知道 One Hot Encoding 是否有一些不同
【参考方案1】:
见下文,但请注意,您不能将 OneHotEncoder 的结果分配给单个数据框列。我怀疑您正在寻找 LabelEncoder。
OneHotEncoder
import pandas as pd
from sklearn.preprocessing import OneHotEncoder
df = pd.DataFrame(
'label': ['Label1', 'Label4', 'Label2', 'Label2', 'Label1', 'Label3', 'Label3']
)
X = df['label'].values.reshape(-1, 1)
enc = OneHotEncoder().fit(X)
X = enc.transform(X).toarray()
print(X)
# [[1. 0. 0. 0.]
# [0. 0. 0. 1.]
# [0. 1. 0. 0.]
# [0. 1. 0. 0.]
# [1. 0. 0. 0.]
# [0. 0. 1. 0.]
# [0. 0. 1. 0.]]
X = enc.inverse_transform(X)
print(X)
# [['Label1']
# ['Label4']
# ['Label2']
# ['Label2']
# ['Label1']
# ['Label3']
# ['Label3']]
标签编码器
import pandas as pd
from sklearn.preprocessing import LabelEncoder
df = pd.DataFrame(
'label': ['Label1', 'Label4', 'Label2', 'Label2', 'Label1', 'Label3', 'Label3']
)
y = df['label'].values
enc = LabelEncoder().fit(y)
y = enc.transform(y)
print(y)
# [0 3 1 1 0 2 2]
y = enc.inverse_transform(y)
print(y)
# ['Label1' 'Label4' 'Label2' 'Label2' 'Label1' 'Label3' 'Label3']
【讨论】:
在执行 enc = OneHotEncoder(sparse=False, handle_unknown='ignore') enc.fit(df["sales"]) 时,我收到错误为“ValueError: Expected 2D array, got 1D array 代替: array=['ab' 'vg' 'ab' 'iu' 'ab' 'vg' 'iu']. 如果您的数据具有单一特征,请使用 array.reshape(-1, 1) 重塑您的数据或 array.reshape(1, -1) 如果它包含单个样本。"【参考方案2】:pandas 中有一个特定的函数,叫做 get_dummies
link
pd.get_dummies(df['Label'])
【讨论】:
以上是关于如何在 Python 中对数据框列进行一次热编码?的主要内容,如果未能解决你的问题,请参考以下文章