day 6 处理分类型数据

 

#  将文字型数据转换为数值型
import pandas as pd
from sklearn.impute import SimpleImputer

data = pd.read_csv('缺失预处理数据22222.csv', index_col=0)  # 把第0列作为索引
data.loc[:, "Age"] = SimpleImputer(strategy="median").fit_transform(data.loc[:, "Age"].values.reshape(-1, 1))
data.dropna(axis=0, inplace=True)

# todo 1: 标签专用
#  preprocessing.LabelEncoder:,能够将分类转换为分类数值
y = data.iloc[:, -1]  # 要输入的是标签,不是特征矩阵,所以允许一维
from sklearn.preprocessing import LabelEncoder

# le = LabelEncoder()  # 实例化
# le = le.fit(y)  # 导入数据
# label = le.transform(y)  # transform接口调取结果
# # print(le.classes_)  # 属性.classes_查看标签中究竟有多少类别
# # print(label)  # 查看获取的结果label
# # le.fit_transform(y)  # 也可以直接fit_transform一步到位
# # le.inverse_transform(label)  # 使用inverse_transform可以逆转
# data.iloc[:,-1]=label
# # print(data.head())
# todo:::::::::::也可以直接简写
data.iloc[:, -1] = LabelEncoder().fit_transform(data.iloc[:, -1])

# todo 2:特征专用
#  preprocessing.OrdinalEncoder:,能够将分类特征转换为分类数值
from sklearn.preprocessing import OrdinalEncoder

# 接口categories_对应LabelEncoder的接口classes_,一模一样的功能
# data_ = data.copy()
# data_.head()
# # categories_  = 上面的le.classes_ 查看有多少分类
# # print(OrdinalEncoder().fit(data_.iloc[:,1:-1]).categories_)
# data_.iloc[:, 1:-1] = OrdinalEncoder().fit_transform(data_.iloc[:, 1:-1])
# print(data_.head())

# todo 3: 独热编码
#  preprocessing.OneHotEncoder:独热编码,创建哑变量
from sklearn.preprocessing import OneHotEncoder

X = data.iloc[:, 1:-1]
enc = OneHotEncoder(categories='auto').fit(X)
result = enc.transform(X).toarray()  # .toarray()  将结果转化为数组
# print(result)
#依然可以直接一步到位,但为了给大家展示模型属性,所以还是写成了上面三步
# OneHotEncoder(categories='auto').fit_transform(X).toarray()
# 还原
# enc.inverse_transform(result)
# print(pd.DataFrame(enc.inverse_transform(result)))
#################### todo:enc.get_feature_names()
####################  查看每个哑变量的对应哪一个特征的类名
# print(enc.get_feature_names())
# 因为生成的哑变量特征矩阵暂时还没和原本data结合,所以最好直接加上这列
#axis=1,表示跨行进行合并,也就是将量表左右相连,如果是axis=0,就是将量表上下相连
newdata = pd.concat([data,pd.DataFrame(result)],axis=1)
# print(newdata.head())
# 因为添加了性别和舱门的哑变量,原来的sex 和embarked 就不要了
newdata.drop(["Sex","Embarked"],axis=1,inplace=True)
newdata.columns =["Age","Survived","Female","Male","Embarked_C","Embarked_Q","Embarked_S"]
print(newdata.head())
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章