我有一个带有混合类型列的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
我很困惑为什么将序列传递到缩放器失败。在上面的完整工作代码中,我希望只将一个序列传递给缩放器,然后将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
df = pd.DataFrame(scale.fit_transform(df.values), columns=df.columns, index=df.index)
这应该在没有折旧警告的情况下起作用。
这样?
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
正如pir的评论中所提到的,.apply(lambda el: scale.fit_transform(el))
方法将产生以下警告:
不推荐使用警告:0.17中不推荐使用将1d数组作为数据传递并将ValueError提高0.19。使用X.整形(-1,1((如果数据只有一个功能(或X.整形(1,-1(如果它包含单个样本。
将列转换为numpy数组就可以了(我更喜欢StandardScaler(:
from sklearn.preprocessing import StandardScaler
scale = StandardScaler()
dfTest[['A','B','C']] = scale.fit_transform(dfTest[['A','B','C']].as_matrix())
--编辑2018年11月(针对熊猫进行测试0.23.4(--
正如Rob Murray在评论中提到的那样,在熊猫的当前版本(v0.23.4(中,.as_matrix()
返回FutureWarning
。因此,应将其替换为.values
:
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
scaler.fit_transform(dfTest[['A','B']].values)
--编辑2019年5月(大熊猫测试0.24.2(-
正如joelostblom在评论中提到的,"由于0.24.0
,建议使用.to_numpy()
而不是.values
。">
更新示例:
import pandas as pd
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
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']].to_numpy())
dfTest
A B C
0 -1.995290 -1.571117 big
1 0.436356 -0.603995 small
2 0.460289 0.100818 big
3 0.630058 0.985826 small
4 0.468586 1.088469 small
只能使用pandas
:
In [235]:
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']})
df = dfTest[['A', 'B']]
df_norm = (df - df.min()) / (df.max() - df.min())
print df_norm
print pd.concat((df_norm, dfTest.C),1)
A B
0 0.000000 0.000000
1 0.926219 0.363636
2 0.935335 0.628645
3 1.000000 0.961407
4 0.938495 1.000000
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['A'])
,而是使用双括号(dfTest[['A']])
。
即CCD_ 13。
我相信这将产生预期的结果。
(针对熊猫测试1.0.5(
基于@athlonshi答案(它有ValueError:无法将字符串转换为C列上的float:"big">(,完整的无警告工作示例:
import pandas as pd
from sklearn.preprocessing import MinMaxScaler
scale = preprocessing.MinMaxScaler()
df = 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']
})
print(df)
df[["A","B"]] = pd.DataFrame(scale.fit_transform(df[["A","B"]].values), columns=["A","B"], index=df.index)
print(df)
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
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
在Sklearn>=上使用set_output(transform='pandas')
1.2.
import pandas as pd
import numpy as np
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler().set_output(transform='pandas') # set_output works from version 1.2
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.head()
我尝试将min_max_scaler.fit_transform()
应用于pd.DataFrame()
的多列
我收到以下消息:
ValueError: Expected 2D array, got 1D array instead:
array=[0.31428571 0.32142857 0.288... 0.46428571]
Reshape your data either using array.reshape(-1, 1) if your data has a single feature...
我的数据实际上只有一个特征(维度(,因此以下方法有效:
columns_to_normalize = ['a', 'b']
min_max_scaler = preprocessing.MinMaxScaler()
for col in columns_to_normalize:
df[col] = min_max_scaler.fit_transform(df[col].values.reshape(-1, 1) )
^^^^^^^^^^^^^^^^^^^^^^