如何在 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 中对数据框列进行一次热编码?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 R 中对多个分类变量进行一次热编码

一次对多列进行一次热编码并附加到主数据集?

一次热编码多维数据

Julia DataFrames - 如何进行一次热编码?

如何在使用 sklearn 进行一次热编码后给出列名?

如何在使用 sklearn 进行一次热编码后给出列名?