【发布时间】:2014-08-29 23:24:48
【问题描述】:
我有一个带有混合类型列的 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 数组,但有时它不会。 -
Pandas 的数据帧是相当复杂的对象,其约定与 scikit-learn 的约定不符。如果将所有内容都转换为 NumPy 数组,scikit-learn 会更容易使用。
-
@edChum -
bad_output = in_max_scaler.fit_transform(dfTest['A'].values)也不起作用。 @larsmans - 是的,我曾想过沿着这条路走,这似乎很麻烦。我不知道 Pandas 可以将完整的数据帧传递给 sklearn 函数,但不是一个系列,这是否是一个错误。我对数据框的理解是它是一个系列的字典。在“Python for Data Analysis”一书中阅读,它指出 pandas 是建立在 numpy 之上的,使其易于在以 NumPy 为中心的应用程序中使用。
标签: python pandas scikit-learn dataframe