我正试图将一个系列传递给用户定义的函数,却得到了以下错误:
功能:
def scale(series):
sc=StandardScaler()
sc.fit_transform(series)
print(series)
呼叫代码:
df['Value'].apply(scale) # df['Value'] is a Series having float dtype.
错误:
ValueError: Expected 2D array, got scalar array instead:
array=28.69.
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.
有人能帮助解决这个问题吗?
方法apply
将对Series
中的每个元素应用一个函数(或者在DataFrame
的情况下,根据所选的轴,对每行或每列应用函数(。在这里,您希望您的函数处理整个Series
并输出一个新的Series
。
因此,您可以简单地运行:
StandardScaler().fit_transform(df['Value'].values.reshape(-1, 1))
StandardScaler
排除2D阵列作为输入,其中每一行是由一个或多个特征组成的样本输入。即使它只是一个单独的功能(就像您的示例中的情况一样(,它也必须具有正确的维度。因此,在将Series
交给sklearn
之前,我正在访问这些值(numpy
表示(并相应地对其进行整形。
有关reshape(-1, ...)
的更多详细信息,请查看:-1在numpy整形中意味着什么?
现在,最好的一点。如果你的整个DataFrame
由一列组成,你可以简单地做:
StandardScaler().fit_transform(df)
即使没有,你仍然可以避免重塑:
StandardScaler().fit_transform(df[['Value']])
请注意,在这种情况下,'Value'
是如何被两组大括号包围的,所以这次它不是Series
,而是带有原始列子集的DataFrame
(以防您不想缩放所有列(。由于DataFrame
已经是二维的,您不需要担心重塑。
最后,如果您只想缩放一些列并更新原始的DataFrame
,那么您所要做的就是:
>>> df = pd.DataFrame({'A': [1,2,3], 'B': [0,5,6], 'C': [7, 8, 9]})
>>> columns_to_scale = ['A', 'B']
>>> df[columns_to_scale] = StandardScaler().fit_transform(df[columns_to_scale])
>>> df
A B C
0 -1.224745 -1.397001 7
1 0.000000 0.508001 8
2 1.224745 0.889001 9