You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:35:11