Pandas 一次缩放多列并使用 groupby() 进行逆变换

Posted

技术标签:

【中文标题】Pandas 一次缩放多列并使用 groupby() 进行逆变换【英文标题】:Pandas scale multiple columns at once and inverse transform with groupby() 【发布时间】:2020-02-25 16:53:02 【问题描述】:

我有一个如下所示的数据框。我想在多列上的 x_data 和 y_data 上应用两个 MinMaxscaler,然后逆变换应该给我实际值。请就此提出建议并帮助我。提前致谢

数据帧:

                 X_data                             y_data       
   Customer     0      1      2      3       Customer      0      1
0    A         855.0  989.0  454.0  574.0        A       395.0  162.0
1    A         989.0  454.0  574.0  395.0        A       162.0  123.0
2    A         454.0  574.0  395.0  162.0        A       123.0  342.0
3    A         574.0  395.0  162.0  123.0        A       342.0  232.0
4    A         395.0  162.0  123.0  342.0        A       232.0  657.0
5    B         875.0  999.0  434.0  564.0        B       345.0  798.0
6    B         999.0  434.0  564.0  345.0        B       798.0  815.0
7    B         434.0  564.0  345.0  798.0        B       815.0  929.0
8    B         564.0  345.0  798.0  815.0        B       929.0  444.0
9    B         345.0  798.0  815.0  929.0        B       444.0  554.0
10   B         798.0  815.0  929.0  444.0        B       554.0  395.0
11   B         815.0  929.0  444.0  554.0        B       395.0  768.0

我可以使用 MinMaxScaler 对一列进行以下操作,但我想将其用于多列

    #to get multilevel to single level
      X_data.columns = list(X_data.columns.levels[1])
      #scaling per user
      scaled_xdata = X_data.groupby('Customer')[0].transform(lambda s: x_scaler.fit_transform(s.values.reshape(-1,1)).ravel())
   #storing into the df
    scaled_xdata =pd.concat([X_data[['Customer']] , scaled_xdata] , axis=1)

我想对数据进行逆变换以获得多列的实际值。这是我为一列尝试的代码

  scaled_xdata_inv = scaled_xdata.groupby('Customer')[0].transform(lambda s: x_scaler.inverse_transform(s.values.reshape(-1,1)).ravel())
scaled_xdata_inv  =pd.concat([X_data[['Customer']] , scaled_xdata_inv] , axis=1)
scaled_xdata_inv

在 inverse_transform 之后,0 列的输出对于客户 A 是错误的,并且为客户 B 得到了正确的值。你能帮我解决这个问题吗

输出:

Customer    0
0   A   851.464646
1   A   999.000000
2   A   409.959596
3   A   542.080808
4   A   345.000000
5   B   875.000000
6   B   999.000000
7   B   434.000000
8   B   564.000000
9   B   345.000000
10  B   798.000000
11  B   815.000000

【问题讨论】:

【参考方案1】:

MinMaxScalar 可以一次接受多个 pandas 数字系列,并按列缩放它们,因此您可以简单地这样做:

x_scaler = MinMaxScaler()
scaled_xdata = x_scaler.fit_transform(df.iloc[:, 1:])
scaled_xdata_inv = x_scaler.inverse_transform(scaled_xdata)

不需要groupbys 或lambdas

【讨论】:

感谢您的回复,但是对于客户 A 的价格值是三位数,如上述数据,客户 B 的价格值位数范围为 9 位数,例如:987234982734.34。那么 groupby 是必需的,对吧?

以上是关于Pandas 一次缩放多列并使用 groupby() 进行逆变换的主要内容,如果未能解决你的问题,请参考以下文章

Pandas Groupby 多列 - 前 N 个

使用多列的 Pandas groupby 函数

pandas groupby 聚合具有多列的自定义函数

Python Pandas groupby 并沿多列排序

Groupby对python中的多列求和并计数

Pandas Groupby 独特的多列