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)
不需要groupby
s 或lambda
s
【讨论】:
感谢您的回复,但是对于客户 A 的价格值是三位数,如上述数据,客户 B 的价格值位数范围为 9 位数,例如:987234982734.34。那么 groupby 是必需的,对吧?以上是关于Pandas 一次缩放多列并使用 groupby() 进行逆变换的主要内容,如果未能解决你的问题,请参考以下文章