fly*_*all 98 python dataframe pandas scikit-learn
我有一个带有混合类型列的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
Run Code Online (Sandbox Code Playgroud)
我很好奇这是否是进行此转换的首选/最有效方式.有没有办法可以使用更好的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
我很困惑为什么将系列传递给缩放器失败.在我上面的完整工作代码中,我曾希望只将一系列文件传递给scaler,然后将dataframe column =设置为缩放系列.我已经看到这个问题问了其他一些地方,但还没有找到一个好的答案.任何帮助了解这里发生的事情将不胜感激!
Let*_*zee 153
我不确定以前的版本是否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
Run Code Online (Sandbox Code Playgroud)
小智 19
像这样?
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
Run Code Online (Sandbox Code Playgroud)
Low*_*ond 10
正如pir的评论中提到的那样 - 该.apply(lambda el: scale.fit_transform(el))方法将产生以下警告:
弃用警告:传递1d数组作为数据在0.17中弃用,并将在0.19中引发ValueError.如果数据具有单个要素,则使用X.reshape(-1,1)重新整形数据;如果包含单个样本,则使用X.reshape(1,-1)重新整形数据.
将列转换为numpy数组应该完成这项工作(我更喜欢StandardScaler):
from sklearn.preprocessing import StandardScaler
scale = StandardScaler()
dfTest[['A','B','C']] = scale.fit_transform(dfTest[['A','B','C']].as_matrix())
Run Code Online (Sandbox Code Playgroud)
- 编辑 2018年11月 -
正如Rob Murray在评论中提到的那样,在当前(v0.23.4)版本的熊猫.as_matrix()回归中FutureWarning.因此,它应该被替换为.values:
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
scaler.fit_transform(dfTest[['A','B']].values)
Run Code Online (Sandbox Code Playgroud)
df = pd.DataFrame(scale.fit_transform(df.values), columns=df.columns, index=df.index)
Run Code Online (Sandbox Code Playgroud)
这应该在没有折旧警告的情况下起作用。
小智 8
我知道这是一个非常古老的评论,但仍然:
不使用单括号(dfTest['A']),而使用双括号(dfTest[['A']])。
IE:min_max_scaler.fit_transform(dfTest[['A']])。
我相信这会产生预期的结果。
你只能使用 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
Run Code Online (Sandbox Code Playgroud)
小智 6
(针对 pandas 1.0.5进行测试)
基于 @athlonshi 答案(它有ValueError: Could not conversion string to float: 'big',在 C 列上),完整的工作示例,没有警告:
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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
106208 次 |
| 最近记录: |