python 基于条件 if 逻辑的标志使用三个不同的列

python flag based on conditional if logic using three different columns

我有以下基于 google 分析数据的 df:

Customer | transaction_id | medium   | first_transaction_flag
ABC        12345            organic      Y
ABC        23456            email        0    
ABC        34567            organic      0
BCD        45678            organic      0
BCD        56789            referral     0

在上面的 df 中,交易 12345 的 first_transaction_flag 为 Y,这意味着这是客户有史以来的第一笔交易。

我需要添加标记为 first_channel 的第二个标志。它应该做的是为那个渠道的那个客户标记,在所有后续交易中,他们被获取为他们的 first_channel = Y。这将是输出:

Customer | transaction_id | medium   | first_transaction_flag | first_channel
ABC        12345            organic      Y                       Y
ABC        23456            email        0                       0
ABC        34567            organic      0                       Y             
BCD        45678            organic      0                       0
BCD        56789            referral     0                       0

基本上,这将是一个条件 if 语句:如果 first_transaction_flag = Y,则将相同的客户和媒介组合标记为 Y。我试图考虑是否可以使用 loc 或 np.where 声明,但没走多远。

可能有更好的方法来解决您的问题,但这适用于:

fc = df[df['first_transaction_flag'] == 'Y'][['Customer', 'medium']]
fc['first_channel'] = 'Y'
df = df.merge(fc, how='outer').fillna(0)
cols = ['Customer', 'medium']
col = 'first_transaction_flag'
df.assign(first_channel=df.groupby(cols)[col].transform('first'))

  Customer  transaction_id    medium first_transaction_flag first_channel
0      ABC           12345   organic                      Y             Y
1      ABC           23456     email                      0             0
2      ABC           34567   organic                      0             Y
3      BCD           45678   organic                      0             0
4      BCD           56789  referral                      0             0

解释

'first' 将获取组内的第一个结果,然后 transform 将其广播到该组的所有索引中。