我有一个这样的数据帧:
### 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