Как получить максимумы нескольких групп на основе столбца группировки?

#python #arrays #list

Вопрос:

У меня есть исходный набор data данных, сгруппированный по id :

 id   x      y
1    0.21   1.00
1    0.34   0.66
1    0.35   0.33
1    0.94   0.00
2    0.11   1.00
2    0.90   0.66
2    0.31   0.33
2    0.33   0.00
3    0.12   1.00
3    0.34   0.71
3    0.64   0.43
3    0.89   0.14
4    0.32   1.00
4    0.33   0.66
4    0.45   0.33
4    0.76   0.00
 

Я пытаюсь предсказать максимум y на основе переменной x , рассматривая группы. Во-первых, я train_test_split основывался на группах:

 data_train
 
 id   x      y
1    0.21   1.00
1    0.34   0.66
1    0.35   0.33
1    0.94   0.00
2    0.11   1.00
2    0.90   0.66
2    0.31   0.33
2    0.33   0.00
 

и

 data_test
 
 id   x      y
3    0.12   1.00
3    0.34   0.66
3    0.64   0.33
3    0.89   0.00
4    0.33   1.00
4    0.32   0.66
4    0.45   0.33
4    0.76   0.00
 

После обучения модели и ее применения data_test я получаю:

 y_hat
0.65
0.33
0.13
0.00
0.33
0.34
0.21
0.08
 

Я пытаюсь преобразовать y_hat так, чтобы максимум в каждой из начальных групп был 1.00 ; в противном случае это 0.00 :

 y_hat_transform
1.00
0.00
0.00
0.00
0.00
1.00
0.00
0.00
 

Как бы я это сделал? Обратите внимание, что группы могут быть разного размера.

Изменить: Чтобы упростить проблему, у меня есть id_test и y_hat , где

 id_test
3
3
3
3
4
4
4
4
 

и я пытаюсь это сделать y_hat_transform .

Ответ №1:

     id  y
0   3   0.65
1   3   0.65
2   3   0.33
3   3   0.13
4   3   0.00
5   4   0.33
6   4   0.34
7   4   0.21
8   4   0.08
 
 # Find max rows per group and assign them values
# I see 1.0 and 0.0 as binary so directly did it by casting to float
# transform gives new column of same size and repeated maxs per group
id_y['y_transform'] = (id_y['y'] == id_y.groupby(['id'])['y'].transform(max)).astype(float)