我有一个带有混合类型列的pandas数据框,我想将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'])
如果我将整个数据帧传递给scaler,它就会工作:
dfTest2 = dfTest.drop('C', axis = 1)
good_output = min_max_scaler.fit_transform(dfTest2)
good_output
我很困惑为什么将序列传递给scaler会失败。在上面的完整工作代码中,我希望只向scaler传递一个序列,然后将dataframe列设置为scaled序列。我在别的地方见过这个问题,但没有找到好的答案。如果您能帮助我们了解这里发生的一切,我们将不胜感激!
我不确定以前的
pandas
版本是否阻止了这一点,但现在下面的代码片段对我来说非常适合,并且可以生成您想要的内容,而无需使用apply
正如pir的注释中提到的那样,
.apply(lambda el: scale.fit_transform(el))
方法将产生以下警告:将列转换为numpy数组应该可以完成这项工作(我更喜欢StandardScaler):
--编辑2018年11月(熊猫测试0.23.4)--
正如Rob Murray在评论中提到的,在当前(v0.23.4)版本的pandas中,
.as_matrix()
返回FutureWarning
。因此,应该用.values
代替:--编辑2019年5月(熊猫测试0.24.2)--
正如joelostblom在评论中提到的,“由于
0.24.0
,建议使用.to_numpy()
,而不是.values
。”更新示例:
像这样?
相关问题 更多 >
编程相关推荐