本文记录如何对数据框的指定列进行归一化
(其实我一开始是想找到一个方法,能直接对数据框的列做归一化,并就地修改,但是我找不到,他貌似必须得先存为一个np然后再转为数据框,再跟原先的数据框拼接,最后还要把原来没归一化的列drop...加上查scaler函数的用法很多文章都是直接对np进行标准化,所以写一篇详细记录一下如果要对数据框的数据进行归一化如何具体实施)
import sklearn.preprocessing as pre
minmax=pre.MinMaxScaler()
age_minmax=minmax.fit_transform(x['Age'])
打算使用sklearn的MinMaxScaler()对数据框x的'Age'列进行归一化,使其取值落在[0,1],但是直接按照上文所运行发现报错,提示
Reshape your data either using array.reshape(-1, 1) if your data has a single feature or array.reshape(1, -1) if it contains a single sample.
然后上网查,说是因为sklearn新版不允许输入一列,必须要输入矩阵,这样就可以
age_minmax=minmax.fit_transform(x['Age'].reshape(-1,1))
也就是加上.reshape(-1,1)
这下我出现了新的报错
'Series' object has no attribute 'reshape'
上网查,提示说加上.values就可以,也就是:
age_minmax=minmax.fit_transform(x['Age'].values.reshape(-1,1))
成功了,但是这样输出的是np array,我们需要把他放回数据框里
很自然,我们想到pd.DataFrame() & pd.concat()
我们顺便在第一个函数里加上columns=['age_minmax']以对列进行命名,so that concat的时候能够有列名
age_minmax=pd.DataFrame(minmax.fit_transform(x['Age'].values.reshape(-1,1)),columns=['age_minmax'])
fare_minmax=pd.DataFrame(minmax.fit_transform(x['Fare'].values.reshape(-1,1)),columns=['fare_minmax'])
pd.concat([x,age_minmax,fare_minmax],axis=1)
好啦,这样就搞定了
全部代码:
import sklearn.preprocessing as pre
minmax = pre.MinMaxScaler()
age_minmax=pd.DataFrame(minmax.fit_transform(x['Age'].values.reshape(-1,1)),columns=['age_minmax'])
fare_minmax=pd.DataFrame(minmax.fit_transform(x['Fare'].values.reshape(-1,1)),columns=['fare_minmax'])
pd.concat([x,age_minmax,fare_minmax],axis=1)