利用pandas将非数值数据转换成数值的方式
handlenonnumericaldata
举个例子,将性别属性男女转换成0-1,精通ML的小老弟们可以略过本文~~,
这里不考虑稀疏向量的使用,仅提供一些思路。本来想直接利用pandas的DataFrame.iloc加上for循环直接转换,但试过一遍之后,原数据并有改变。。。。蛋疼写了一个比较菜的函数,如下。
#非数值列处理函数 defhandel_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#构造对应种类数值转化字典 foriinunique_kinds: convert_dict[i]=x x+=1 defconvert(val): returnconvert_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,而且总是运行出错,如下
defhandle_non_numerical_data(df): columns=df.columns.values forcolumnincolumns: text_digit_vals={} defconvert_to_int(val): returntext_digit_vals[val] ifdf[column].dtype!=np.int64anddf[column].dtype!=np.float64: column_content=df[column].values.tolist() unique_elements=set(column_content) print(unique_elements) x=0 foruniqueinunique_elements: ifuniquenotintext_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方法
fromsklearn.preprocessingimportLabelEncoder
注:tqdm是进度条库,不需要关注。另外没有去看这个接口的源码,应该也是最简单的one-hot
以上这篇利用pandas将非数值数据转换成数值的方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。