类别变量
文本转换为数值(一列类别变量)
适用于有序变量(小学、初中、高中、大学;差、中、良、优…)
from sklearn.preprocessing import LabelEncoder
df = pd.DataFrame([[2,'aa'],[3,'ss'],[33,'aa'],[43,'dd'],[66,'dd']])
# 这个类没什么参数,可以一行代码解决战斗
df[1] = LabelEncoder().fit_transform(df[1])
# 查看有哪些类别
le = LabelEncoder()
df[1] = le.fit_transform(df[1])
le.classes_
文本转换为数值(很多列类别变量)
适用于有序变量
from sklearn.preprocessing import OrdinalEncoder
df = pd.DataFrame([[2,'aa','a'],[3,'ss','a'],[33,'aa','s'],[43,'dd','s'],[66,'dd','a']])
df[[1,2]] = OrdinalEncoder().fit_transform(df[[1,2]]) # 只用一行
OrdinalEncoder().fit(df.iloc[:,1:]).categories_ # 查看类别
独热编码
适用于名义变量,应该最常用
from sklearn.preprocessing import OneHotEncoder
df = pd.DataFrame([[11,'male','a'],[22,'male','s'],[33,'male','d'],[33,'female','a'],[22,'female','s'],[11,'female','s'],[22,'female','d']], columns=['age','gender','class'])
enc = OneHotEncoder().fit(df.iloc[:,1:]) # 只fit想要编码的类别变量列
enc.categories_ # 看具体有哪些类别
enc.get_feature_names() # 看编码后的列
res = OneHotEncoder(sparse=False).fit_transform(df.iloc[:,1:]) # 只用一行
# 或者写:OneHotEncoder().fit_transform(X).toarray()
# 把编码后的结果放进特征矩阵
# axis=1表示跨行进行合并,也就是将表左右相连,如果是axis=0,就是将表上下相连
newdata = pd.concat([df,pd.DataFrame(res)],axis=1)
newdata.drop(["gender","class"],axis=1,inplace=True)
newdata.columns = ["age","Female","Male","class_a","class_d","class_s"]
print(newdata)