我有一个包含混合类型列的panda Dataframe ,我想对其中的一些列应用sklearn的min_max_scaler。理想情况下,我想在适当的位置进行这些转换,但还没有找到一种方法来完成。我已经编写了下面的代码:
import pandas as pd
import numpy as np
from sklearn import preprocessing
scaler = preprocessing.MinMaxScaler()
dfTest = pd.DataFrame({'A':[14.00,90.20,90.95,96.27,91.21],'B':[103.02,107.26,110.35,114.23,114.68], 'C':['big','small','big','small','small']})
min_max_scaler = preprocessing.MinMaxScaler()
def scaleColumns(df, cols_to_scale):
for col in cols_to_scale:
df[col] = pd.DataFrame(min_max_scaler.fit_transform(pd.DataFrame(dfTest[col])),columns=[col])
return df
dfTest
A B C
0 14.00 103.02 big
1 90.20 107.26 small
2 90.95 110.35 big
3 96.27 114.23 small
4 91.21 114.68 small
scaled_df = scaleColumns(dfTest,['A','B'])
scaled_df
A B C
0 0.000000 0.000000 big
1 0.926219 0.363636 small
2 0.935335 0.628645 big
3 1.000000 0.961407 small
4 0.938495 1.000000 small
我很好奇这是否是进行这种转换的首选/最有效的方法。有没有一种方法可以使用df.apply更好?
我也很惊讶我不能让下面的代码工作:
bad_output = min_max_scaler.fit_transform(dfTest['A'])
如果我将整个dataframe传递给scaler,它会工作:
dfTest2 = dfTest.drop('C', axis = 1)
good_output = min_max_scaler.fit_transform(dfTest2)
good_output
我很困惑为什么传递一个序列给scaler失败了。在我上面完整的工作代码中,我希望只是传递一个序列给scaler,然后设置dataframe column =为scaled series。
8条答案
按热度按时间6tqwzwtp1#
我不确定以前版本的
pandas
是否阻止了这一点,但现在下面的代码片段对我来说非常好,并且完全可以生成您想要的内容,而不必使用apply
ezykj2lf2#
这应该在没有折旧警告的情况下工作。
s71maibg3#
像这样?
uplii1fm4#
正如在pir的评论中提到的-
.apply(lambda el: scale.fit_transform(el))
方法将产生以下警告:弃用警告:在0.17中不推荐将1d数组作为数据传递,并且在0.19中将引发ValueError。如果数据具有单个特征,则使用X.reshape(-1,1)或X.reshape(1,-1)来重塑数据,如果它包含单个样本。
将列转换为numpy数组应该可以完成这项工作(我更喜欢StandardScaler):
--编辑2018年11月(测试Pandas0.23.4)--
正如Rob Murray在评论中提到的,在pandas的当前版本(v0.23.4)中,
.as_matrix()
返回FutureWarning
。因此,应该将其替换为.values
:--编辑2019年5月(Pandas测试0.24.2)--
正如joelostblom在评论中提到的,“由于
0.24.0
,建议使用.to_numpy()
而不是.values
。”更新示例:
r1zhe5dt5#
你可以使用
pandas
来实现:pvcm50d16#
我知道这是一个非常古老的评论,但仍然:
使用双括号
(dfTest[['A']])
代替单括号(dfTest['A'])
。即
min_max_scaler.fit_transform(dfTest[['A']])
。我相信这会给予预期的结果。
kmb7vmvb7#
(针对pandas1.0.5进行测试)
基于@athlonshi答案(它有 ValueError:无法将字符串转换为浮点:'big',on C column),没有警告的完整工作示例:
798qvoo88#
我尝试将
min_max_scaler.fit_transform()
应用于pd.DataFrame()
的多个列我收到了以下信息:
我的数据实际上只有一个特征(维度),所以下面的方法有效: