这四个函数对我来说看起来非常相似。在某些情况下,它们中的一些可能会给出相同的结果,而有些则不会。任何帮助都将不胜感激!
现在我知道了,并且我假设在内部,factorize
和 LabelEncoder
的工作方式相同,在结果方面没有太大的差异。我不确定它们在处理大量数据时是否会占用相似的时间。
get_dummies
和 OneHotEncoder
会产生相同的结果,但 OneHotEncoder
只能处理数字,而 get_dummies
可以接受各种类型的输入。get_dummies
会为每个输入列自动生成新的列名,但 OneHotEncoder
不会(它会分配新的列名 1,2,3…)。因此,get_dummies
在各个方面都更好。
如果我错了,请纠正我!谢谢你!
回答:
这四个编码器可以分为两类:
- 将标签编码为分类变量:Pandas 的
factorize
和 scikit-learn 的LabelEncoder
。结果将具有一维。 - 将分类变量编码为虚拟/指示(二进制)变量:Pandas 的
get_dummies
和 scikit-learn 的OneHotEncoder
。结果将有 n 维,每个编码的分类变量的不同值对应一个维度。
Pandas 和 scikit-learn 编码器之间的主要区别在于,scikit-learn 编码器设计用于在scikit-learn 管道中使用,具有 fit
和 transform
方法。
将标签编码为分类变量
Pandas 的 factorize
和 scikit-learn 的 LabelEncoder
属于第一类。它们可以用于创建分类变量,例如将字符转换为数字。
from sklearn import preprocessing # 测试数据
df = DataFrame(['A', 'B', 'B', 'C'], columns=['Col'])
df['Fact'] = pd.factorize(df['Col'])[0]
le = preprocessing.LabelEncoder()
df['Lab'] = le.fit_transform(df['Col'])
print(df)
# Col Fact Lab
# 0 A 0 0
# 1 B 1 1
# 2 B 1 1
# 3 C 2 2
将分类变量编码为虚拟/指示(二进制)变量
Pandas 的 get_dummies
和 scikit-learn 的 OneHotEncoder
属于第二类。它们可以用于创建二进制变量。OneHotEncoder
只能用于分类整数,而 get_dummies
可以用于其他类型的变量。
df = DataFrame(['A', 'B', 'B', 'C'], columns=['Col'])
df = pd.get_dummies(df)
print(df)
# Col_A Col_B Col_C
# 0 1.0 0.0 0.0
# 1 0.0 1.0 0.0
# 2 0.0 1.0 0.0
# 3 0.0 0.0 1.0
from sklearn.preprocessing import OneHotEncoder, LabelEncoder
df = DataFrame(['A', 'B', 'B', 'C'], columns=['Col'])
# 我们需要先将字符转换为整数,以便使用 OneHotEncoder
le = preprocessing.LabelEncoder()
df['Col'] = le.fit_transform(df['Col'])
enc = OneHotEncoder()
df = DataFrame(enc.fit_transform(df).toarray())
print(df)
# 0 1 2
# 0 1.0 0.0 0.0
# 1 0.0 1.0 0.0
# 2 0.0 1.0 0.0
# 3 0.0 0.0 1.0
我还基于这个回答写了一篇更详细的文章。