使用Sklearn StandardScaler处理DataFrame单列后结果格式异常问题
解决StandardScaler处理单列后新列是(1,1)数组的问题
嘿,我懂你碰到的这个小麻烦了——用apply调用scaler.transform后,新列里全是嵌套的(1,1)数组,这确实不是我们想要的数值格式。让我来帮你搞定它!
问题根源
StandardScaler.transform()方法要求输入是二维数组(形状为(n_samples, n_features)),它返回的结果也是二维数组。而你用df['c'].apply(scaler.transform)的时候,是把c列的每个单独标量(比如3、4、5)传给transform,这时候方法会自动把单个值包装成[[x]]这样的二维数组,处理完自然就返回[[标准化后的值]],所以新列的每个元素都是这种嵌套数组。
解决方案
这里有几种简单的修复方式,选你喜欢的就行:
方法1:直接处理整列(最推荐)
跳过apply,直接对整列的二维数组进行拟合和转换,然后用ravel()或者flatten()把结果转成一维数组赋值给新列:
import pandas as pd from sklearn.preprocessing import StandardScaler df = pd.DataFrame([(1,2,3), (2,3,4), (3,4,5)], columns=['a','b','c']) scaler = StandardScaler() # 拟合并转换c列,reshape保证输入是二维,ravel转成一维 df['d'] = scaler.fit_transform(df['c'].values.reshape(-1,1)).ravel()
方法2:用lambda提取数组中的值
如果你一定要保留apply的写法,那就用lambda函数把transform返回的二维数组里的数值提取出来:
import pandas as pd from sklearn.preprocessing import StandardScaler df = pd.DataFrame([(1,2,3), (2,3,4), (3,4,5)], columns=['a','b','c']) scaler = StandardScaler().fit(df['c'].values.reshape(-1,1)) # 提取transform返回数组的第一个元素的第一个值 df['d'] = df['c'].apply(lambda x: scaler.transform([[x]])[0][0])
验证结果
运行上面的代码后,你再打印df,就能看到d列是正常的数值了:
a b c d 0 1 2 3 -1.224745 1 2 3 4 0.000000 2 3 4 5 1.224745
内容的提问来源于stack exchange,提问作者masotann
相关产品推荐
相关产品推荐

