python数据预处理: 字符变量独热编码(one-hot encoding)

版权声明:本文为博主原创文章,如若转载请注明出处 https://blog.csdn.net/tonydz0523/article/details/84261781

许多的数据采样中会有很多以以字符串形式出现的数据,这样的数据没有办法直接跟其他数值变量合并成向量,这些值一般是分类数据或是顺序数据。

  • 分类数据:分类数据指某些数据类别的只能归于某一类非数值型数据,例如男、女。分类数据中的值没有明显高低好坏之分,只是由来区分两个或多个具有相同或相当价值的属性。
  • 顺序数据:顺序数据只能归于某一有序类别的非数值型数据,例如用户的价制度分为高、中、低。在顺序数据中,有明显的逻辑排序。
import pandas as pd
import numpy as np

# 导入数据
df = pd.read_csv('https://raw.githubusercontent.com/ffzs/dataset/master/Questionnaire.csv', usecols=[0, 1, 5])

# 更改列名
df.columns = ['Gender', 'Country', 'Edu']
df0 = df[:10]

# 看下数据
	Gender	Country	Edu
0	Female	United States	Master's degree
1	Male	Canada	Master's degree
2	Male	United States	Master's degree
3	Male	Taiwan	Doctoral degree
4	Male	Brazil	Doctoral degree
5	Male	United States	Master's degree
6	Female	India	Bachelor's degree
7	Female	Australia	Bachelor's degree
8	Male	Russia	Bachelor's degree
9	Female	Russia	Bachelor's degree

# pandas 方法
# 使用get_dummies函数
pd.get_dummies(df0)


# 使用 sklearn
from sklearn.preprocessing import OneHotEncoder, LabelEncoder

columes = df0.columns
for col in columes:
    data = df0[col]
    if data.dtype == 'object':
        new_columns = []
        label = LabelEncoder()
        oneHot = OneHotEncoder()
        la_data = label.fit_transform(data).reshape(-1, 1)
        for cla in label.classes_:
            new_columns.append(col+'_'+cla)
        one_data = oneHot.fit_transform(la_data).toarray()
        enc_df = pd.DataFrame(one_data , columns=new_columns)
        del df0[col]
        df0 = pd.concat([df0, enc_df], axis=1)

pandas的get_dummies和 sklearn的 OneHotEncoder区别:

  • OneHotEncoder不能直接处理字符串值。 如果你的名义特征是字符串,那么你需要先把它们映射成整数。

  • pandas.get_dummies是相反的。 默认情况下,除非指定了列,否则它仅将字符串列转换为单热表示形式。

猜你喜欢

转载自blog.csdn.net/tonydz0523/article/details/84261781