我想将 MinmaxScaler 应用于许多熊猫数据帧"一起"。这意味着我希望缩放器对这些列中的所有数据执行,而不是分别对每列执行。
我的数据帧有 20 列。我想同时在其中 12 列上应用缩放器。我已经读过了。但它并不能解决我的问题,因为它分别作用于每一列。
IIUC,您希望sklearn
缩放器具有相同条件(在本例中为最小和最大定义)拟合和转换多个列。这是您可以做到这一点的一种方法 -
- 您可以保存列的初始形状,然后将这些列的 numpy 数组转换为 2D 数组中的一维数组。
- 接下来,您可以调整缩放器并转换此 1D 数组
- 最后,您可以使用旧形状将数组重新塑造回所需的 n 列并保存它们
这种方法的优点是它适用于您需要使用的任何 sklearn 缩放器,MinMaxScaler
、StandardScaler
等。
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']})
cols = ['A','B']
old_shape = dfTest[cols].shape #(5,2)
dfTest[cols] = scaler.fit_transform(dfTest[cols].to_numpy().reshape(-1,1)).reshape(old_shape)
print(dfTest)
A B C
0 0.000000 0.884188 big
1 0.756853 0.926301 small
2 0.764303 0.956992 big
3 0.817143 0.995530 small
4 0.766885 1.000000 small
您可以从这些列中提取"最小"和"最大"统计信息并自行执行缩放:
# columns of interest
cols = [...]
# get the minimum and maximum values in that region
vals = df[cols].to_numpy()
min_val = vals.min()
max_val = vals.max()
# scale the region using them
df[cols] = df[cols].sub(min_val).div(max_val - min_val)
(sub
是执行"-"的方法方法,div
用于"/"。
上面,df
是你的训练数据帧;要缩放测试数据帧,你可以用最后一行中的df
替换,例如
test_df[cols] = test_df[cols].sub(min_val).div(max_val - min_val)
而不是单独提取它的最小值/最大值,这会从测试集中泄漏信息。