这四个功能看起来与我非常相似。在某些情况下,其中一些可能会给出相同的结果,有些则不会。感谢任何帮助!
现在我知道并且我认为在内部,Loading data to table db_socmed_gp.tb_gp_account
chgrp: changing ownership of 'hdfs://lobah:8021/user/hive/warehouse/db_socmed_gp.db/tb_gp_account/part-m-00000': User does not belong to hive
chgrp: changing ownership of 'hdfs://lobah:8021/user/hive/warehouse/db_socmed_gp.db/tb_gp_account/part-m-00001': User does not belong to hive
chgrp: changing ownership of 'hdfs://lobah:8021/user/hive/warehouse/db_socmed_gp.db/tb_gp_account/part-m-00002': User does not belong to hive
chgrp: changing ownership of 'hdfs://lobah:8021/user/hive/warehouse/db_socmed_gp.db/tb_gp_account/part-m-00003': User does not belong to hive
Table db_socmed_gp.tb_gp_account stats: [numFiles=4, totalSize=21254586]
和factorize
的工作方式相同,并且在结果方面没有太大差异。我不确定他们是否会在大量数据上占用相似的时间。
LabelEncoder
和get_dummies
会产生相同的结果,但OneHotEncoder
只能处理数字,但OneHotEncoder
会接受各种输入。 get_dummies
会自动为每个列输入生成新的列名,但get_dummies
不会(它会分配新的列名称1,2,3 ....)。所以OneHotEncoder
在各个方面都更好。
如果我错了,请纠正我!谢谢!
答案 0 :(得分:26)
这四种编码器可分为两类:
factorize
和scikit-learn LabelEncoder
。结果将有1个维度。get_dummies
和scikit-learn OneHotEncoder
。结果将具有n个维度,一个是编码分类变量的不同值。 pandas和scikit-learn编码器之间的主要区别在于scikit-learn编码器可用于{strong> scikit-learn pipelines ,使用fit
和transform
方法。
Pandas factorize
和scikit-learn LabelEncoder
属于第一类。它们可用于创建分类变量,例如将字符转换为数字。
from sklearn import preprocessing
# Test data
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'])
# We need to transform first character into integer in order to use the 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
我还根据这个答案写了更详细的post。