提问者:小点点

使用sklearn扩展数据帧列


我有一个带有混合类型列的熊猫数据框,我想将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=设置为缩放序列。我在其他一些地方看到过这个问题,但没有找到好的答案。任何帮助了解这里发生的事情都将不胜感激!


共3个答案

匿名用户

我不确定以前版本的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)

这应该在没有折旧警告的情况下工作。