我有一个混合类型的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'])
如果我将整个数据框传递给缩放器,它会起作用:
dfTest2 = dfTest.drop('C', axis = 1)
good_output = min_max_scaler.fit_transform(dfTest2)
good_output
我不明白为什么把一个序列传递给缩放器会失败。在我上面的完整工作代码中,我希望只需将序列传递给缩放器,然后将数据框列设置为已缩放的序列。
bad_output = min_max_scaler.fit_transform(dfTest['A'].values)
,它能正常工作吗?访问values
属性会返回一个 numpy 数组,由于某种原因,有时 scikit learn api 会正确调用使 pandas 返回 numpy 数组的方法,有时则不会。 - EdChumbad_output = in_max_scaler.fit_transform(dfTest['A'].values)
也不起作用。@larsmans - 是的,我曾考虑过这种方法,但似乎很麻烦。我不知道Pandas是否可以将整个数据框传递给sklearn函数,但不能传递系列。我理解数据框是系列的字典。在《Python数据分析》一书中阅读时,它指出pandas是构建在numpy之上,使其易于在以NumPy为中心的应用程序中使用。 - flyingmeatball