数据部分的最小-最大缩放器



我有一个这样的数据帧:

### To Stack
df_stack = pd.DataFrame([['SGA', 'FT', 5.6994352340698242],
['SGA', 'ST', 1.518241786956787],
['EXT', 'FT', 20.853669309616087],
['EXT', 'ST', 3.5596847057342529],
['LGT', 'FT', 9.853669309616087],
['LGT', 'ST', 8.5596847057342529]], columns = (('idobj','description','value')))
df_stack
idobj   description value
SGA FT         5.69944
SGA ST         1.51824
EXT FT        20.85367
EXT ST         3.55968
LGT FT         9.85367
LGT ST         8.5596

我需要对部分数据应用最小-最大缩放(例如,对'Description'='ST'应用MinMaxScaler,然后对'Description'='ST'应用MinMaxScaler(。

当我将CCD_ 5应用于每个";描述";这边:

scaler.fit(df_stack[(df_stack['description']=='FT')]['value'].values.reshape(-1,1))
scaler.transform(df_stack[(df_stack['description']=='FT')]['value'].values.reshape(-1,1))
array([[0.     ],
[1.     ],
[0.27413]])
scaler.fit(df_stack[(df_stack['description']=='ST')]['value'].values.reshape(-1,1))
scaler.transform(df_stack[(df_stack['description']=='ST')]['value'].values.reshape(-1,1))
array([[0.     ],
[0.28992],
[1.     ]])

我最终失去了与我的";描述";。

我试着通过添加这样一个新列来手动计算:

df_stack['description_norm'] = (df_stack[(df_stack['description']=='FT')]['value']-
df_stack[(df_stack['description']=='FT')]['value'].min())/
(df_stack[(df_stack['description']=='FT')]['value'].max()-
df_stack[(df_stack['description']=='FT')]['value'].min())

但后来我得到了另一个专栏:

idobj   description value   description_norm
0   SGA FT  5.69944        0.00000
1   SGA ST  1.51824        NaN
2   EXT FT  20.85367       1.00000
3   EXT ST  3.55968        NaN
4   LGT FT  9.85367        0.27413
5   LGT ST  8.55968        NaN

当我试图根据条件"FT"将这个新列上的值分配给变量"Description"时,它根本不起作用?!?

df_stack[(df_stack['description']=='FT')]['value']=df_stack[(df_stack['description']=='FT')]['description_norm']

我错过了什么?

预期结果应该是:

idobj   description value
SGA FT         0
SGA ST         0
EXT FT         1
EXT ST         0.28992
LGT FT         0.27413
LGT ST         1

欢迎提出任何想法。

您想要做的是根据另一列的值在一列上应用一个函数,在panda中,最好的方法是使用groupby

在这种情况下,我们可以像这样手动缩放:

df_stack['value'] = df_stack.groupby('description')['value'].
apply(lambda x: (x-x.min())/(x.max()-x.min()))

或使用MinMaxScaler:

df_stack['value'] = df_stack.groupby('description')['value'].
transform(lambda x: MinMaxScaler().fit_transform(x.values.reshape(-1,1)).flatten())

两者都会给出相同的结果:

idobj description     value
0   SGA          FT  0.000000
1   SGA          ST  0.000000
2   EXT          FT  1.000000
3   EXT          ST  0.289918
4   LGT          FT  0.274130
5   LGT          ST  1.000000

最新更新