首页 > 解决方案 > 如何传递一个系列来调用用户定义的函数?

问题描述

我正在尝试将一系列传递给用户定义的函数并收到此错误:

功能:

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.

任何人都可以帮助解决这个问题吗?

标签: pythonuser-defined-functions

解决方案


该方法apply将对 中的每个元素应用一个函数Series(或者在DataFrame每行或每列的情况下,取决于所选轴)。在这里,您希望您的函数处理整个函数Series并输出一个新函数Series

因此,您可以简单地运行:

StandardScaler().fit_transform(df['Value'].values.reshape(-1, 1))

StandardScaler将二维数组作为输入除外,其中每一行都是包含一个或多个特征的样本输入。即使它只是一个单一的功能(在您的示例中似乎就是这种情况),它也必须具有正确的尺寸。因此,在将您Series交给sklearn我之前,我正在访问这些值(numpy表示)并相应地对其进行重塑。

有关reshape(-1, ...)查看此内容的更多详细信息:-1 在 numpy reshape 中意味着什么?

现在,最好的一点。如果您的整个DataFrame内容由一列组成,您可以简单地执行以下操作:

StandardScaler().fit_transform(df)

即使没有,您仍然可以避免重塑:

StandardScaler().fit_transform(df[['Value']])

请注意,在这种情况下,'Value'它是如何被 2 组大括号包围的,所以这次它不是 aSeries而是DataFrame带有原始列的一个子集(以防您不想缩放所有列)。由于 aDataFrame已经是二维的,因此您无需担心重塑。

最后,如果您只想缩放某些列并更新原始列,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

推荐阅读