Создать столбец на основе нескольких условий в разных столбцах

Создание столбца в кадре данных на основе нескольких условий на основе значений из разных столбцов.

Цель состоит в том, чтобы получить указание на то, когда первое интересное действие было совершено покупателем, это будет представлено 1 под t0.

Dataframe структурирован следующим образом:

      cust_id       first_act     prod_1  prod_2   t0
0      1                  1          1              
22     2                                            
23     2                                     1                      
24     2                             1              
25     2                                            
26     3                  1
27     3
28     3
29     4
30     4

Я хочу присвоить значение столбцу t0 на основе следующих условий:

если у клиента есть 1 под prod_1: присвойте значение 1 t0 в индексе, где он имеет 1 под prod_1.

если у клиента нет 1 в prod_1, проверьте, есть ли у клиента 1 в prod_2, и если true, присвойте t0 значение 1 по индексу, где условие истинно.

наконец: если у клиента нет prod_1 или prod_2, но есть 1 в first_act, присвойте значение 1 индексу, где первое действие истинно, в t0.

После этих условий должно быть только одно значение в t0 для каждого клиента.

Ожидаемый результат для cust_id 2:

 cust_id       first_act     prod_1  prod_2   t0
0      1            1          1              
22     2            1                                
23     2                               1                      
24     2                       1               1    
25     2                                            
26     3            1
27     3
28     3
29     4
30     4

Я попытался сделать это с помощью вложенных операторов np.where, но это не сработало следующим образом:

df['t0'] = np.where(df['prod_1'] == 1, 1 ,
                         np.where(df['prod_2'] == 1, 1,
                                 np.where(df['first_act'] == 1, 1, 0)))

Добавляет 1 к t0 в нескольких местах.

Обновлять

@Jeffyx Я не знаю, проясняет ли это немного, но я подумал об этом:

if prod_1 == 1:
    t0 = 1 at index of prod_1 == 1
if not prod_1 == 1:
    if prod_2 == 1:
        t0 = 1 at index of prod_2 == 1
if not prod_1 == 1 and not prod_2 == 1:
    if first_act == 1:
        t0 = 1 at index of first_act == 1

person merdy    schedule 06.06.2019    source источник
comment
Я не собираюсь врать, мне трудно понять ваши требования к ['t0'], чтобы иметь 1, но я знаю, что простой способ ответить на ваш вопрос — это использовать [ссылка] (pandas.pydata.org/pandas-docs/stable/reference/ api/) pandas loc. Это простой способ обновить столбец с несколькими условиями.   -  person Jeffyx    schedule 06.06.2019
comment
Согласен с @Jeffyx - я прочитал требования и проверил, соответствует ли мой ожидаемый результат вашему, и это даже не близко. Попробую еще раз глянуть после вашего обновления.   -  person Tim S.    schedule 06.06.2019
comment
Я понимаю, что это может ввести в заблуждение. Пробовал перефразировать, помогает?   -  person merdy    schedule 06.06.2019


Ответы (1)


Вы должны найти первый индекс, соответствующий вашему условию, а затем использовать этот индекс для установки значения в столбце t0.

Используя groupby, это дает:

for _, sub in df.groupby(['cust_id']):              # test for each cust_id
    for col in ['prod_1', 'prod_2', 'first_act']:   # test columns in sequence
        tmp = sub[sub[col] == 1]                    # try to match
        if len(tmp) != 0:                           # ok found at least one
            df.loc[tmp.index[0], 't0'] = 1          # set t0 to 1 for first index found
            break
person Serge Ballesta    schedule 06.06.2019
comment
Спасибо, это идеально. Я не знал, что вы можете перебирать группы, используя _. - person merdy; 06.06.2019
comment
Итерация по groupby возвращает пары (index, sub_dataframe). Переменная - — это всего лишь указание на то, что я не буду использовать здесь индекс. - person Serge Ballesta; 06.06.2019