我有一个带有混合类型列的熊猫数据框,我想将skLearning的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\u输出=最小最大缩放器。拟合变换(dfTest['A'])
如果我将整个数据帧传递给定标器,它将工作:
dfTest2=dfTest。下降('C',轴=1)良好输出=最小最大缩放器。拟合变换(dfTest2)输出良好
我不明白为什么将序列传递给定标器会失败。在上面的完整工作代码中,我希望只将一个序列传递给scaler,然后将dataframe column=设置为缩放序列。我在其他一些地方看到过这个问题,但没有找到好的答案。任何帮助了解这里发生的事情都将不胜感激!
我不确定以前版本的pandas
是否阻止了这一点,但现在下面的代码片段非常适合我,可以生成您想要的内容,而无需使用apply
>>> import pandas as pd
>>> from sklearn.preprocessing import MinMaxScaler
>>> scaler = 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']})
>>> dfTest[['A', 'B']] = scaler.fit_transform(dfTest[['A', 'B']])
>>> dfTest
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
像这样吗?
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']
})
dfTest[['A','B']] = dfTest[['A','B']].apply(
lambda x: MinMaxScaler().fit_transform(x))
dfTest
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 = pd.DataFrame(scale.fit_transform(df.values), columns=df.columns, index=df.index)
这应该在没有折旧警告的情况下工作。