分类数据和顺序数据是常见的数据类型。
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]方法直接新增列值。