#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