1. 程式人生 > >python資料預處理: 字元變數獨熱編碼(one-hot encoding)

python資料預處理: 字元變數獨熱編碼(one-hot encoding)

許多的資料取樣中會有很多以以字串形式出現的資料,這樣的資料沒有辦法直接跟其他數值變數合併成向量,這些值一般是分類資料或是順序資料。

  • 分類資料:分類資料指某些資料類別的只能歸於某一類非數值型資料,例如男、女。分類資料中的值沒有明顯高低好壞之分,只是由來區分兩個或多個具有相同或相當價值的屬性。
  • 順序資料:順序資料只能歸於某一有序類別的非數值型資料,例如使用者的價制度分為高、中、低。在順序資料中,有明顯的邏輯排序。
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是相反的。 預設情況下,除非指定了列,否則它僅將字串列轉換為單熱表示形式。