Intro
onehot的操作,解决两个问题:
- 可以把列名关联上去
- 可以处理之前的value
数据构造
import pandas as pd
df=pd.DataFrame({"id":[1,2,3,4],"grade":["A","B","A","C"],"class":[ "1班","2班","3班","1班"]})
pd.get_dummies
category_feature=["grade","class"]
pd.concat([df,pd.get_dummies(df[category_feature])],axis=1)
id | grade | class | grade_A | grade_B | grade_C | class_1班 | class_2班 | class_3班 | |
---|---|---|---|---|---|---|---|---|---|
0 | 1 | A | 1班 | 1 | 0 | 0 | 1 | 0 | 0 |
1 | 2 | B | 2班 | 0 | 1 | 0 | 0 | 1 | 0 |
2 | 3 | A | 3班 | 1 | 0 | 0 | 0 | 0 | 1 |
3 | 4 | C | 1班 | 0 | 0 | 1 | 1 | 0 | 0 |
pandas这个功能数据处理时方便,但是有个小问题,训练集和测试集是分开处理的,对测试集onehot时,列的顺序、是否出现训练集中没有的值,都是难以解决的问题。
OneHotEncoder
from sklearn.preprocessing import OneHotEncoder
df_new = df.query("id!=4")
enc = OneHotEncoder(handle_unknown='ignore',sparse=False)
enc.fit(df_new[category_feature])
pd.DataFrame(enc.transform(df[category_feature]),columns=enc.get_feature_names_out())
grade_A | grade_B | class_1班 | class_2班 | class_3班 | |
---|---|---|---|---|---|
0 | 1.0 | 0.0 | 1.0 | 0.0 | 0.0 |
1 | 0.0 | 1.0 | 0.0 | 1.0 | 0.0 |
2 | 1.0 | 0.0 | 0.0 | 0.0 | 1.0 |
3 | 0.0 | 0.0 | 1.0 | 0.0 | 0.0 |
id=4这条数据,grade=C,不属于A也不属于B则都是0,此时满足需求
2022-01-12 于南京市江宁区九龙湖