根据不同列上的多个条件创建列
Create column based on multiple conditions on different columns
基于来自不同列的值的多个条件在数据框中创建列。
目标是了解第一个感兴趣的操作何时发生在客户身上,这将在 t0 下用 1 表示。
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 赋值:
如果客户在 prod_1 下有 1:将值 1 赋值给 t0 在其在 prod_1 下有 1 的索引处。
如果客户在 prod_1 下没有 1,请检查客户在 prod_2 下是否有 1,如果为真,则在条件为真的索引处为 t0 分配 1 的值。
最后:如果客户没有 prod_1 或 prod_2 但在 first_act 下确实有一个 1,则将值 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
您必须找到符合您条件的第一个索引,然后使用该索引在 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
基于来自不同列的值的多个条件在数据框中创建列。
目标是了解第一个感兴趣的操作何时发生在客户身上,这将在 t0 下用 1 表示。
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 赋值:
如果客户在 prod_1 下有 1:将值 1 赋值给 t0 在其在 prod_1 下有 1 的索引处。
如果客户在 prod_1 下没有 1,请检查客户在 prod_2 下是否有 1,如果为真,则在条件为真的索引处为 t0 分配 1 的值。
最后:如果客户没有 prod_1 或 prod_2 但在 first_act 下确实有一个 1,则将值 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
您必须找到符合您条件的第一个索引,然后使用该索引在 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