數據預處理:將分類和順序數據轉換爲標誌變量

 分類數據和順序數據是常見的數據類型。

Python標誌轉換示例

說明:在本示例中,將模擬有兩列數據分別出現分類數據和順序數據的情況,並通過自定義代碼以及sklearn代碼分別進行標誌轉換。

import pandas as pd 
from sklearn.preprocessing import OneHotEncoder # 導入OneHotEncoder

# 生成數據
df = pd.DataFrame({'id':[3566841, 6541227, 3512441],
                  'sex':['male','Female','Female'],
                  'level':['high','low','middle']})
print(df)
        id     sex   level
0  3566841    male    high
1  6541227  Female     low
2  3512441  Female  middle

自定義轉換主過程

df_new = df.copy() # 複製一份新的數據用來存儲轉換結果
for col_num, col_name in enumerate(df): # 循環讀出每個列的索引值和列名
    col_data = df[col_name] # 獲得每列數據
    col_dtype = col_data.dtype # 獲得每列dtype類型
    if col_dtype == 'object': # 如果dtype類型是object(非數值型),執行條件
        df_new = df_new.drop(col_name, 1) # 刪除df數據框中要進行標誌轉換的列
        value_sets = col_data.unique() # 獲取分類和順序變量中的每個值
        for value_unique in value_sets: # 讀取分類和順序變量中的每個值
            col_name_new = col_name + '_' + value_unique # 創建新的列名,使用“原標題+值”的命名方式
            col_tmp = df.iloc[:, col_num] # 獲取原始數據列
            new_col = (col_tmp == value_unique)  # 將原始數據列與每個值進行比較,相同爲True,否則爲False
            df_new[col_name_new] = new_col # 爲最終結果增加新列值
print(df_new)


        id  sex_male  sex_Female  level_high  level_low  level_middle
0  3566841      True       False        True      False         False
1  6541227     False        True       False       True         False
2  3512441     False        True       False      False          True

使用sklearn進行標誌轉換

df2 = pd.DataFrame({'id':[3566841, 6541227, 3512441],
                  'sex':[1,2,2],
                  'level':[3,1,2]})
id_data = df.values[:, :1] # 獲得ID列
print(id_data)
[[3566841]
 [6541227]
 [3512441]]
transform_data = df2.values[:, 1:] # 指定要轉換的列
print("標誌轉換前數據:")
print(transform_data)
enc = OneHotEncoder() # 建立模型對象
df2_new = enc.fit_transform(transform_data).toarray() # 標誌轉換,使用toarray方法輸出矩陣。
print("標誌轉換後數據:")
print(df2_new)
df2_all = pd.concat((pd.DataFrame(id_data), pd.DataFrame(df2_new)), axis=1) # 組合爲數據框
print("組合後的數據:")
print(df2_all)
標誌轉換前數據:
[[1 3]
 [2 1]
 [2 2]]
標誌轉換後數據:
[[1. 0. 0. 0. 1.]
 [0. 1. 1. 0. 0.]
 [0. 1. 0. 1. 0.]]
組合後的數據:
         0    0    1    2    3    4
0  3566841  1.0  0.0  0.0  0.0  1.0
1  6541227  0.0  1.0  1.0  0.0  0.0
2  3512441  0.0  1.0  0.0  1.0  0.0

知識點總結

  1. 通過pd.DataFrame進行構建新的數據框;
  2. 通過pandas中的df[name]和iloc[]進行數據切片;
  3. 通過pandas中的drop()方法刪除特定的列,當然也可以用於刪除行;
  4. 通過pandas的dtype獲得對象的dtype類型,df.dtypes也能實現所有對象的類型;
  5. 通過np.unique()方法獲取唯一值;
  6. 通過字符串組合(使用+號)創建一個新的字符串
  7. 直接使用矩陣(Series)對象無需遍歷每個值進行矩陣比較和數值計算。
  8. 通過pandas的df_new[col_name_new]方法直接新增列值。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章