Создать столбец на основе нескольких условий в разных столбцах - PullRequest
1 голос
/ 06 июня 2019

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

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

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

      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

1 Ответ

0 голосов
/ 06 июня 2019

Вы должны найти первый индекс, соответствующий вашему условию, а затем использовать этот индекс для установки значения в столбце 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
...