如何基于Pandas DataFrame条件规则为用户生成对应忠诚度标签
实现方案
完整代码
import pandas as pd import numpy as np # 示例数据初始化 data = { 'user_id': [ '9EPWZVMNP6D6KWX', '9EPWZVMNP6D6KWX', '9EPWZVMNP6D6KWX', '9EPWZVMNP6D6KWX', '9EPWZVMNP6D6KWX', '9EPWZVMNP6D6KWX' ], 'timestamp': [ 1612139269, 1612139665, 1612139579, 1612141096, 1612143046, 1612143729 ], 'type': ['productDetails', 'productDetails', 'checkout:confirmation', 'checkout:confirmation', 'productList', 'checkout:confirmation'], 'session': [0,1,2,3,4,5], 'count_session_products': [4, 1, 0, 4, 2, 2]} test_df = pd.DataFrame(data) # 第一步:按用户ID+时间戳排序,保证行为顺序正确 test_df = test_df.sort_values(['user_id', 'timestamp']).reset_index(drop=True) # 第二步:赋值前两类标签,修正原有逻辑漏加的count_session_products>0规则条件 test_df['loyalty'] = np.where( (test_df['session'] > 0) & (test_df['type'] != 'checkout:confirmation') & (test_df['count_session_products'] > 0), 'frequent_visitor', None ) test_df.loc[test_df['session'] == 0, 'loyalty'] = 'first_time_visitor' # 第三步:统计每个用户checkout:confirmation的出现次序 # 筛选出下单行,按用户分组统计次序(从1开始计数) test_df['checkout_rank'] = test_df[test_df['type'] == 'checkout:confirmation'].groupby('user_id').cumcount() + 1 # 非下单行填充为0 test_df['checkout_rank'] = test_df['checkout_rank'].fillna(0).astype(int) # 第四步:赋值客户类标签 test_df.loc[test_df['checkout_rank'] == 1, 'loyalty'] = 'first_time_customer' test_df.loc[test_df['checkout_rank'] == 2, 'loyalty'] = 'repeat_customer' test_df.loc[test_df['checkout_rank'] >= 3, 'loyalty'] = 'loyal_customer' # 可选:删除辅助列 test_df = test_df.drop('checkout_rank', axis=1) # 输出结果 print(test_df)
逻辑说明
- 排序是必要前置步骤:必须按用户+时间戳排序,才能保证统计的下单次序符合实际行为先后顺序
- 下单次序统计用
groupby.cumcount():可以针对每个用户的下单行自动生成从0开始的序列,加1后就得到第1/2/3次下单的标记 - 标签赋值优先级:下单类标签优先级高于访客类标签,后执行赋值会覆盖原来的None值,不会和已有标签冲突
运行结果示例
最终输出的loyalty列对应结果如下:
| 索引 | user_id | loyalty |
|---|---|---|
| 0 | 9EPWZVMNP6D6KWX | first_time_visitor |
| 1 | 9EPWZVMNP6D6KWX | frequent_visitor |
| 2 | 9EPWZVMNP6D6KWX | first_time_customer |
| 3 | 9EPWZVMNP6D6KWX | repeat_customer |
| 4 | 9EPWZVMNP6D6KWX | frequent_visitor |
| 5 | 9EPWZVMNP6D6KWX | loyal_customer |
内容的提问来源于stack exchange,提问作者Salaaned
相关产品推荐
相关产品推荐

