如何传递序列来调用用户定义的函数



我正试图将一个系列传递给用户定义的函数,却得到了以下错误:

功能:

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

相关内容

  • 没有找到相关文章

最新更新