python - 如何传递一个系列来调用用户定义的函数?
问题描述
我正在尝试将一系列传递给用户定义的函数并收到此错误:
功能:
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
将二维数组作为输入除外,其中每一行都是包含一个或多个特征的样本输入。即使它只是一个单一的功能(在您的示例中似乎就是这种情况),它也必须具有正确的尺寸。因此,在将您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
推荐阅读
- azure - Azure Functions Core Tools 中的动态代理?
- ruby-on-rails - Postgres(数组)与 Rails 模型序列化的优缺点
- java - Collectors.groupingBy(...) 的返回类型是什么?
- python - 将 JSON 值插入 mysql 但正在插入 0
- hive - 我们可以使用哪些字符和格式来为 Hive 表指定分隔符?
- javascript - 使用 JavaScript 进行即时表单验证
- sql - 产品的分层 SQL 查询
- html - 如何在角度 html 中生成具有行跨度的表格行?
- wordpress-gutenberg - 返回模态的`edit()`抛出异常
- laravel - 如何解决 laravel 错误:Carbon.php 中的未知 getter id?