基于不同列上的多个条件创建列

2024-04-20 06:09:03 发布

您现在位置:Python中文网/ 问答频道 /正文

基于基于不同列的值的多个条件在数据帧中创建列。你知道吗

我们的目标是得到一个迹象,当第一个有趣的行动是一个客户,这将代表一个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下有1:在产品1下有1的索引处给t0赋值1。你知道吗

如果客户在产品1下没有1,请检查客户在产品2下是否有1,如果为真,则在条件为真的索引处为t0赋值1。你知道吗

最后:如果客户没有prod\u 1或prod\u 2,但在first\u act下有1,则在t0下,将值1赋给first act为真的索引。你知道吗

在这些条件之后,每个客户的t0中应该只有一个值。你知道吗

客户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.哪里但不起作用的声明如下:

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

在多个位置向t0添加1。你知道吗

更新

@杰弗里克斯 我不知道这是否能让事情明朗一点,但我想到的是:

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

Tags: iddfindex客户if产品npprod
1条回答
网友
1楼 · 发布于 2024-04-20 06:09:03

必须找到与条件匹配的第一个索引,然后使用该索引在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

相关问题 更多 >