python資料預處理: 字元變數獨熱編碼(one-hot encoding)
阿新 • • 發佈:2018-11-26
許多的資料取樣中會有很多以以字串形式出現的資料,這樣的資料沒有辦法直接跟其他數值變數合併成向量,這些值一般是分類資料或是順序資料。
- 分類資料:分類資料指某些資料類別的只能歸於某一類非數值型資料,例如男、女。分類資料中的值沒有明顯高低好壞之分,只是由來區分兩個或多個具有相同或相當價值的屬性。
- 順序資料:順序資料只能歸於某一有序類別的非數值型資料,例如使用者的價制度分為高、中、低。在順序資料中,有明顯的邏輯排序。
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是相反的。 預設情況下,除非指定了列,否則它僅將字串列轉換為單熱表示形式。