看来题主还太年轻,不知道Python已有的库中有对于字符串类型数据的转换,因此手动写了一个。
但是还是要提前说一下,相关方法都有哪些,后来以便做一次总结。
对于某些数据属性是字符串代表的类型,在分类、聚类、回归时,为了方便处理,会将其对应转化成数值型。
相关转换方法有: label encoding/one-hot encoding /target encoding等
自定义 仿 label 代码如下:
import pandas as pd
#将所获得的字典存入txt文件中
def saveDictToTxt(dict,fileName):
f = open(fileName, 'w')
f.write(str(dict))
f.close()
#从txt获得已有的dict
def getDictFromTxt(fileName):
f = open(fileName, 'r')
a = f.read()
dict = eval(a)
f.close()
return dict
#利用字典类型 实现 字符类别转换成数字类别
def changeToNum(data,fileColumnName):
fileExit=1
#如果文件不存在 则字典初始化为空
try:
# dict=getDictFromExcel(fileColumnName)
dict=getDictFromTxt(fileColumnName)
print("use old:",fileColumnName)
except:
dict={}
fileExit=0
#数据总行数
size=data.size
#要在原有的字典上进行累加
j=len(dict)
if j==0:
print("use new:",fileColumnName)
# print("len:",j)
for i in range(0,size):
# print(i)
# 如果有则替换,无则在字典中相应替换
if data[i] in dict.keys():
data[i]=dict[data[i]]
else:
dict[data[i]]=j
data[i] = dict[data[i]]
j=j+1
print(j)
fileExit = 0
#更新
if fileExit==0:
saveDictToTxt(dict,fileColumnName)
# saveDictToExcel(dict,fileColumnName)
# 改变所有列
def changeAll(data,fileSave):
# 获得所有的列名
columnNum = list(data)
for i in columnNum:
fileColumnName = i + ".txt"
changeToNum(data[i],fileColumnName)
fileColumnName2=i + ".csv"
data[i].to_csv(fileColumnName2)
data.to_csv(fileSave)
#判断数据是否存在空值数据 存在则填充为0 存储并另存为
def dataFillNull(data,fileName):
dataIsNull = data.isnull().any()
# 如果为空则填充
for i in dataIsNull:
if i:
print("exsit null,fill them with 0")
data.fillna(0, inplace=True)
break
data.to_csv(fileName)
if __name__ == '__main__':
# fileName = "Text_a_op1.csv"
fileName = "Text_op2.csv"
fileSave="Text_op8.csv"
# data = pd.read_excel(fileName)
data=pd.read_csv(fileName)
# print(data.isnull().any())
#缺失填充为0 必须提前填充 否则字典类型从txt导入时
dataFillNull(data,"Text_t_op1.csv")
print(data.isnull().any())
changeAll(data,fileSave)
Python库中已有方法
import pandas as pd
import numpy as np
from sklearn.preprocessing import LabelEncoder
train=pd.read_csv("train_trans.csv")
test=pd.read_csv("test_a_trans.csv")
cat_cols=train.columns.values
for col in cat_cols:
le = LabelEncoder()
le.fit(np.concatenate([train[col], test[col]]))
train[col] = le.transform(train[col])
test[col] = le.transform(test[col])
print(train)