我有一个数据框:
df = Condition A_value B_value
15 2 3
30 1 8
45 5 1
15 3 9
30 4 6
45 8 2
15 5 2
30 7 3
45 9 1
15 0 8
30 8 7
45 1 3
我要申请sklearn.preprocessing.StandardScaler
在每列上,按类型。 (这意味着它将缩放A_value
列的行,其中condition=15
,然后A_value分别为30、45和B_value分别为15、30和45。
有没有一种方法可以不遍历所有组? (例如单线吗?)
最好的方法是什么?
答案 0 :(得分:1)
使用GroupBy.transform
和Series.to_frame
分别处理每个组中的每一列,添加DataFrame.set_index
来处理没有Condition
的所有列:
from sklearn.preprocessing import StandardScaler
f = lambda x: (StandardScaler().fit_transform(x.to_frame()))[:, 0]
df = df.set_index('Condition').groupby('Condition').transform(f).reset_index()
print (df)
Condition A_value B_value
0 15 -0.277350 -0.821995
1 30 -1.460593 1.069045
2 45 -0.240966 -0.904534
3 15 0.277350 1.150793
4 30 -0.365148 0.000000
5 45 0.722897 0.301511
6 15 1.386750 -1.150793
7 30 0.730297 -1.603567
8 45 1.044185 -0.904534
9 15 -1.386750 0.821995
10 30 1.095445 0.534522
11 45 -1.526117 1.507557