数据预处理:将分类和顺序数据转换为标志变量

 分类数据和顺序数据是常见的数据类型。

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]方法直接新增列值。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小狼躲藏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值