Рассчитать разницу для подмножеств строк в Python

1

У меня есть следующий фрейм данных python

Variable_1  Variable_2  Variable_3  Target
G   M   I   230
G   M   I   231
G   M   I   233
G   M   I   231
G   M   I   230
G   M   I   214
G   M   L   211
G   M   L   212
G   M   L   123
G   M   L   345
G   N   J   32
G   N   J   123
G   N   J   234
G   N   O   2345
G   N   O   432
G   N   O   455
G   N   O   543
G   N   O   333

Рассмотрим только Variable_3. Для каждой категории Variable_3 я хочу сравнить последнюю из этого Target с первым значением Target. Например:

  • когда Variable_3 равно "I", тогда я сравниваю 214 (последнее значение) с 230, которое является "первым" значением, и если последнее значение больше первого значения, тогда я создаю новое поле "Выход", которое равно 1, в противном случае поле "Выход" равно -1.

Из приведенного выше примера я хотел бы, чтобы мой результирующий набор данных выглядел так:

Variable_1  Variable_2  Variable_3  Target  Output
G   M   I   230 -1
G   M   I   231 -1
G   M   I   233 -1
G   M   I   231 -1
G   M   I   230 -1
G   M   I   214 -1
G   M   L   211 1
G   M   L   212 1
G   M   L   123 1
G   M   L   345 1
G   N   J   32  1
G   N   J   123 1
G   N   J   234 1
G   N   O   2345    -1
G   N   O   432 -1
G   N   O   455 -1
G   N   O   543 -1
G   N   O   333 -1
Теги:
subset

2 ответа

1

Пытаться:

df.loc[:, 'Output'] = df.groupby('Variable_3')['Target']\
                        .transform(lambda x: -1 if x.iloc[-1] > x.iloc[0] else 1)
1

Группируйте данные с помощью Variable_3 и найдите первый и последний целевые объекты в каждой группе. Сравните их:

groups = df.groupby('Variable_3')['Target']
output = groups.first() > groups.last()

Объедините вывод со старым фреймворком данных на основе Variable_3 в качестве индекса:

df = df.set_index('Variable_3').join(output, rsuffix='_r').reset_index()

Преобразуйте логические значения в 1s и -1s:

import numpy as np
df['Target_r'] = np.where(df['Target_r'], -1, 1)

Наконец, измените имя нового столбца:

df.rename(columns={'Target_r' : 'Output'}, inplace=True)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню