溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

利用pandas將非數(shù)值數(shù)據(jù)轉(zhuǎn)換成數(shù)值的方式

發(fā)布時(shí)間:2020-10-15 10:01:10 來(lái)源:腳本之家 閱讀:245 作者:可以調(diào)素琴 欄目:開(kāi)發(fā)技術(shù)

handle non numerical data

舉個(gè)例子,將性別屬性男女轉(zhuǎn)換成0-1,精通ML的小老弟們可以略過(guò)本文~~,

這里不考慮稀疏向量的使用,僅提供一些思路。本來(lái)想直接利用pandas的DataFrame.iloc加上for循環(huán)直接轉(zhuǎn)換,但試過(guò)一遍之后,原數(shù)據(jù)并有改變。。。。蛋疼寫(xiě)了一個(gè)比較 菜的函數(shù),如下。

# 非數(shù)值列處理函數(shù)
def handel_non_numerical_data(df,name): #----------------name是需要處理的列名稱(str),暫不考慮列表
 nrows = len(df[name])  #----------------數(shù)據(jù)集的行數(shù)
 old_col = df.columns.tolist() #----------------初始的列名集合
 name_index = old_col.index(name) #---------要處理的列的在數(shù)據(jù)集中的索引值
 name_data = df[name].values.tolist()#-----------將要處理煩人列復(fù)制成一個(gè)列表
 df.drop([name],axis =1,inplace =True) 
 unique_kinds = set(name_data)
 convert_dict = {}; x = 0   #構(gòu)造對(duì)應(yīng)種類數(shù)值轉(zhuǎn)化字典
 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函數(shù)直接迭代轉(zhuǎn)化
 
 new_col = df.columns.tolist()
 new_col.insert(name_index,name)
 df.reindex(columns = new_col) #----------------重構(gòu)數(shù)據(jù)的列
 df[name] = name_data

跑了一遍沒(méi)有出錯(cuò),注意這只是baseline…,如果對(duì)數(shù)值有要求的話,需要自行改動(dòng)

原本是想直接用youtube上sentdex老哥ml35期視頻里的代碼的,但發(fā)現(xiàn)了幾個(gè)較為嚴(yán)重的bug,而且總是運(yùn)行出錯(cuò) ,如下

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]))

可見(jiàn),非常暴力,注意到他的if條件,有的數(shù)據(jù)集中會(huì)出現(xiàn)字母數(shù)字組合的情況【會(huì)出現(xiàn)dtype=object的情況】,set之后種類會(huì)草雞多…,這樣的話數(shù)值轉(zhuǎn)換也就失去了意義【當(dāng)然,如果你的樣本量是億級(jí)的,幾千幾百個(gè)種類無(wú)所謂我也無(wú)fuck說(shuō),這種情況我認(rèn)為必須使用稀疏向量了】,另外這個(gè)代碼一直報(bào)錯(cuò),不知道為什么,有興趣的老哥可以復(fù)制跑一下幫我解答一下。。。

---------------------------2019-08-21分割:

https://www.kaggle.com/nroman/recursive-feature-elimination

LabelEncoder方法

from sklearn.preprocessing import LabelEncoder

利用pandas將非數(shù)值數(shù)據(jù)轉(zhuǎn)換成數(shù)值的方式

注:tqdm是進(jìn)度條庫(kù),不需要關(guān)注。另外沒(méi)有去看這個(gè)接口的源碼,應(yīng)該也是最簡(jiǎn)單的one-hot

以上這篇利用pandas將非數(shù)值數(shù)據(jù)轉(zhuǎn)換成數(shù)值的方式就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持億速云。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI