Преобразования фрейма данных с использованием информации из group_by

#python #pandas #pandas-groupby

#python #pandas #pandas-groupby

Вопрос:

У меня есть набор данных для двоичной классификации, который выглядит следующим образом:

 group_id    pos_in_group    ...    target
...         ...                    ...
172          0                      0
172          1                      0
172          2                      1
172          3                      0
172         ...                    ...
172         719                     0
  

Так получилось, что в группе может быть только одна запись target == 1 , и это, скорее всего, произойдет на первых позициях. Но модель, используемая для прогнозирования, этого не учитывает. Таким образом, в одной группе может быть несколько записей с предсказанным target == 1 значением.

 group_id    pos_in_group    ...    target
...         ...                    ...
172          0                      0
172          1                      0
172          2                      1
172          3                      0
172          4                      1
172          5                      0
172         ...                    ...
172         719                     0
  

С помощью df[df['target'] == 1].groupby(['group_id'])['pos'].min() я могу получить первое вхождение target == 1 в каждой группе. Как я могу использовать это для присвоения target == 0 всем записям с более высокой позицией в каждой группе?

Кроме того, как с помощью 1 / df.groupby(['group_id'])['target'].sum() я могу масштабировать столбец в каждой группе на другое значение?

Комментарии:

1. ['pos'] вы имеете в виду столбец ['pos_in_group'] ?

2. Да, я просто сократил это в тексте.

3. с df.groupby(['group_id'])['pos'].min() вы бы получили первую строку в этом случае. Но target == 1 находится в строке 3. Какова именно ваша цель? Поскольку с этим кодом вы не получаете первое вхождение target == 1

4. ДА… извините, это была опечатка. Конечно, сначала мне нужно отфильтровать target == 1

5. Масштабирование может быть выполнено с помощью этого: df['target'] = df.groupby('group_id')['target'].apply(lambda t: t / t.sum())

Ответ №1:

Если я вас правильно понял. Для вашего первого вопроса вы можете использовать df.groupby.min и после этого заполнить target столбец условно np.where :

 target_min = df[df.target == 1].groupby('group_id').pos_in_group.min()

df['target'] = np.where(df.pos_in_group.isin(target_min), 1, 0)

print(df)
   group_id  pos_in_group  target
0       172             0       0
1       172             1       0
2       172             2       1
3       172             3       0
4       172             4       0
5       172             5       0
6       172           719       0