利用pandas将非数值数据转换成数值

handle non numerical data

举个例子,将性别属性男女转换成0-1,精通ML的小老弟们可以略过本文~~,
这里不考虑稀疏向量的使用,仅提供一些思路。本来想直接利用pandas的DataFrame.iloc加上for循环直接转换,但试过一遍之后,原数据并有改变。。。。蛋疼写了一个比较 菜的函数,如下。

#  非数值列处理函数
def handel_non_numerical_data(df,name): #----------------name是需要处理的列名称(str),暂不考虑列表
    nrows = len(df[name])               #----------------数据集的行数
    old_col = df.columns.tolist()       #----------------初始的列名集合
    name_index = old_col.index(name)    #---------要处理的列的在数据集中的索引值
    name_data = df[name].values.tolist()#-----------将要处理烦人列复制成一个列表
    df.drop([name],axis =1,inplace =True)   
    unique_kinds = set(name_data)
    convert_dict = {}; x = 0                     #构造对应种类数值转化字典
    for i in unique_kinds:
        convert_dict[i] = x
        x += 1
    def convert(val):
        return convert_dict[val] 
    name_data = list(map(convert,name_data))#利用map函数直接迭代转化
        
    new_col = df.columns.tolist()
    new_col.insert(name_index,name)
    df.reindex(columns = new_col) #----------------重构数据的列
    df[name] = name_data

跑了一遍没有出错,注意这只是baseline…,如果对数值有要求的话,需要自行改动
原本是想直接用youtube上sentdex老哥ml35期视频里的代码的,但发现了几个较为严重的bug,而且总是运行出错 ,如下

def handle_non_numerical_data(df):
    columns = df.columns.values
    for column in columns:
        text_digit_vals = {}
        def convert_to_int(val):
            return text_digit_vals[val]
        if df[column].dtype != np.int64 and df[column].dtype != np.float64:
            column_content = df[column].values.tolist()
            unique_elements = set(column_content)
            print(unique_elements)
            x =0
            for unique in unique_elements:
                if unique not in text_digit_vals:
                    text_digit_vals[unique] = x
                    x+=1
        df[column] = list(map(convert_to_int,df[column]))

可见,非常暴力,注意到他的if条件,有的数据集中会出现字母数字组合的情况【会出现dtype=object的情况】,set之后种类会草鸡多…,这样的话数值转换也就失去了意义【当然,如果你的样本量是亿级的,几千几百个种类无所谓我也无fuck说,这种情况我认为必须使用稀疏向量了】,另外这个代码一直报错,不知道为什么,有兴趣的老哥可以复制跑一下帮我解答一下。。。

---------------------------2019-08-21分割:
https://www.kaggle.com/nroman/recursive-feature-elimination

LabelEncoder方法

from sklearn.preprocessing import LabelEncoder
利用pandas将非数值数据转换成数值_第1张图片
注:tqdm是进度条库,不需要关注。另外没有去看这个接口的源码,应该也是最简单的one-hot

你可能感兴趣的:(机器学习,py数据处理及可视化)