Панды масштабируют несколько столбцов одновременно и обратное преобразование с помощью groupby () - PullRequest
0 голосов
/ 30 октября 2019

У меня есть кадр данных, как показано ниже. Я хочу применить два MinMaxscalers к x_data и y_data для нескольких столбцов, а затем обратное преобразование должно дать мне фактические значения. Пожалуйста, предложите и помогите мне в этом. Заранее спасибо

DataFrame:

                 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 Ответ

0 голосов
/ 30 октября 2019

MinMaxScalar может одновременно принимать несколько pandas числовых серий и масштабировать их по столбцам, поэтому вы можете просто сделать:

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

Нет необходимости в groupby с или lambda s

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...