分類數據和順序數據是常見的數據類型。
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
知識點總結
- 通過pd.DataFrame進行構建新的數據框;
- 通過pandas中的df[name]和iloc[]進行數據切片;
- 通過pandas中的drop()方法刪除特定的列,當然也可以用於刪除行;
- 通過pandas的dtype獲得對象的dtype類型,df.dtypes也能實現所有對象的類型;
- 通過np.unique()方法獲取唯一值;
- 通過字符串組合(使用+號)創建一個新的字符串
- 直接使用矩陣(Series)對象無需遍歷每個值進行矩陣比較和數值計算。
- 通過pandas的df_new[col_name_new]方法直接新增列值。