在pandas DataFrame中对多列使用MinMaxScaler

3
我想在一些pandas DataFrame上“同时”应用MinmaxScaler。这意味着我希望缩放器对这些列中的所有数据执行,而不是分别对每列执行。
我的DataFrame有20列。我想同时在其中的12个列上应用缩放器。我已经阅读了this。但它不能解决我的问题,因为它会单独作用于每列。

在业界中,一种方法是将列展平为1D数组(技术上仍然是2D数组),进行拟合和应用转换,然后将数组重新调整为原始形状,就像我在我的答案中所展示的那样。 - Akshay Sehgal
2个回答

1
我理解您想要使用sklearn的缩放器以相同的标准(在这种情况下是最小值和最大值定义)拟合和转换多列数据。以下是一种实现方法:
  1. 您可以保存列的初始形状,然后将这些列的numpy数组从2D数组转换为1D数组。
  2. 接下来,您可以拟合缩放器并转换此1D数组。
  3. 最后,您可以使用旧的形状将数组重新塑造为所需的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

1

您可以从这些列中提取“min”和“max”统计数据,并自行执行缩放:

# 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)

而不是分别提取最小/最大值,这样会泄露测试集的信息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接