python - 在 Pandas 数据框中按 MinMaxScaler 分组
问题描述
我想将 minmax 缩放器应用于数据帧 df 中的 X2 和 X3 列,并为每个月添加 X2_Scale 和 X3_Scale 列。
df = pd.DataFrame({
'Month': [1,1,1,1,1,1,2,2,2,2,2,2,2],
'X1': [12,10,100,55,65,60,35,25,10,15,30,40,50],
'X2': [10,15,24,32,8,6,10,23,24,56,45,10,56],
'X3': [12,90,20,40,10,15,30,40,60,42,2,4,10]
})
下面的代码是我尝试过的,但出错了。
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
cols = df.columns[2:4]
df[cols + 'scale'] = df.groupby('Month')[cols].scaler.fit_transform(df[cols])
我怎样才能做到这一点?谢谢你。
解决方案
方法一
对列进行分组和转换,X2
并X3
使用缩放函数应用最小-最大缩放转换并返回缩放值
def scale(X):
X_ = np.atleast_2d(X)
return pd.DataFrame(scaler.fit_transform(X_), X.index)
df[cols + '_scale'] = df.groupby('Month')[cols].apply(scale)
方法二
让我们坚持基础并计算相应列和每个组的min
,值,然后使用计算的最小值-最大值将缩放公式应用于列max
X2
X3
g = df.groupby('Month')[cols]
min_, max_ = g.transform('min'), g.transform('max')
df[cols + '_scale'] = (df[cols] - min_) / (max_ - min_)
结果
Month X1 X2 X3 X2_scale X3_scale
0 1 12 10 12 0.153846 0.025000
1 1 10 15 90 0.346154 1.000000
2 1 100 24 20 0.692308 0.125000
3 1 55 32 40 1.000000 0.375000
4 1 65 8 10 0.076923 0.000000
5 1 60 6 15 0.000000 0.062500
6 2 35 10 30 0.000000 0.482759
7 2 25 23 40 0.282609 0.655172
8 2 10 24 60 0.304348 1.000000
9 2 15 56 42 1.000000 0.689655
10 2 30 45 2 0.760870 0.000000
11 2 40 10 4 0.000000 0.034483
12 2 50 56 10 1.000000 0.137931
推荐阅读
- javascript - 通过module.exports发送多个函数抛出错误
- mysql - 每年销量最高的产品
- perl - perl 中的 chdir 使用两个字符串: chdir "/home/$dir1/$dir2"
- vue.js - nuxtjs nuxt-validate 不起作用
- vue.js - Vue + Vuex:格式化输入数据
- c - 为什么信号在 Linux 中依赖于平台?
- kotlin - 如何使用 Fuel 为 HTTP 请求构建代理
- angular - Angular 8:无法读取未定义的属性“runOutsideAngular”
- php - php artisan make auth 未在 laravel 6 中定义
- azure-devops - 使用另一个变量检索变量组中的变量