我们获取到的数据并不是所有的特征都可以用的,用时候我们需要对特征进行计算,得出新的特征,然后替换掉 用来不用的特征, 这个时候需要用替换操作。比较常用的是replace
函数
将金牌数为0的替换为无
df['金牌数'].replace(0,'无',inplace=True)
将金牌数中的0和无替换成nan和none
df.replace(['无',0],[np.nan,'None'],inplace = True) #传入列表
二分类型替换
有时候会对一些数值型的变量做替换,比如我们有一列是游戏的售价,游戏有各种价格,也有很多游戏是不收费的,我们想知道收费的和不收费的游戏分别有多少,我们就需要将所有售价大于0的归类为付费游戏,所有售价等于零的归类为免费游戏
store['FreePaidTag'] = ["Free" if i ==0 else "Paid" for i in store.Price]
- 在这里面使用了一个行内的条件语句,用if语句做判断售价是否为0,然后用for循环遍历售价这列中的每行值,进行替换操作
分类型变量替换
对于多分类型数据,比如客户的信用评级,学生的等级这类的数据,可以使用map函数进行快速的替换
for data in [data_train, data_test_a]:
data['grade'] = data['grade'].map({'A':1,'B':2,'C':3,'D':4,'E':5,'F':6,'G':7})
- 在map函数中用字典实现替换值之间的一一对应
独热编码
使用独热编码在处理多分类型数据中非常常用,独热编码将离散型特征的每一种取值都看成一种状态,构建出一个对角矩阵,且是方阵。每一个行向量就代表了我们的一个离散型变量
# 类型数在2之上,又不是高维稀疏的,且纯分类特征
for data in [data_train, data_test_a]:
data = pd.get_dummies(data, columns=['subGrade', 'homeOwnership',
'verificationStatus', 'purpose', 'regionCode'], drop_first=True)
- 在pandas中庸
get_dummies
来对变量进行独热编码
用其他列的值进行替换
data['出院诊断'].loc[data['出院诊断']=='错误'] = data[data['出院诊断']=='错误']['入院诊断']
- 这里将出院诊断这列中值为错误的,替换为了入院诊断的相对应的值,使用了向量化的做法,避免写过多的循环
可以用正则表达
data['出院诊断'].loc[data['出院诊断'].str.contains('\d\d\d',regex=True)] = '错误'
- 这里将出院诊断这列中值为数字的替换为错误
上面两者结合
data['出院诊断'].loc[data['出院诊断'].str.contains('\d\d\d',regex=True)data['出院诊断']=='错误'] = data[data['出院诊断']=='错误']['入院诊断']
- 将出院诊断这列中值为数字的替换为了入院诊断这列中相对应的值
有时候需要替换筛选后的值,在pandas的筛选一般使用的是loc[]
,但是这样会创建一个副本,后面的replace(,,inplace=true)
也只是在副本上进行了替换,解决办法如下
data.update(data.loc[(data['XM'].str.contains('毛$',regex=True) == True) & (data['NL'] < 1)].replace('毛毛$', '', regex=True))
data.loc[(data['XM'].str.contains('小$',regex=True) == True) & (data['NL'] < 1),['XM','NL']] = data.loc[(data['XM'].str.contains('小$',regex=True) == True) & (data['NL'] < 1),['XM','NL']].replace('小$',"",regex=True)