如何在user_id窗口中为前后周期创建新增零售商条件列?
解决方法
要找出后周期(sample2)中用户的新增零售商,核心是按user_id分组,判断该用户在后周期使用的零售商是否存在于前周期(sample1)的记录中。以下是两种高效的实现方案:
方案一:利用合并(Merge)标记新增项
通过左连接后周期数据与去重后的前周期数据,根据连接结果判断是否为新增零售商:
import pandas as pd # 前周期数据去重,保留每个用户的唯一零售商记录 sample1_unique = sample1.drop_duplicates(subset=['user_id', 'retailer']) # 左连接后周期数据与去重后的前周期数据,添加连接标记列 merged = sample2.merge( sample1_unique, on=['user_id', 'retailer'], how='left', indicator='merge_status' ) # 根据连接标记生成新增零售商标识:仅在后周期存在则标记为1,否则为0 sample2['is_new_retailer'] = merged['merge_status'].map({'left_only': 1, 'both': 0}) # 输出结果(与期望格式一致) print(sample2.to_dict())
方案二:构建用户-零售商映射快速判断
先为每个用户构建前周期的零售商集合,再逐行判断后周期的零售商是否属于该集合:
import pandas as pd # 生成{user_id: 前周期零售商集合}的字典映射 user_retailer_set = sample1.groupby('user_id')['retailer'].apply(set).to_dict() # 逐行判断后周期零售商是否为新增 sample2['is_new_retailer'] = sample2.apply( lambda row: 1 if row['retailer'] not in user_retailer_set.get(row['user_id'], set()) else 0, axis=1 ) # 输出结果 print(sample2.to_dict())
为什么之前的方法可能失败?
- 直接使用
is_in()时如果没有按user_id分组,会错误地将所有用户的零售商混在一起判断,导致结果不准确。 - 反连接如果没有同时基于
user_id和retailer两个字段匹配,无法精准定位到某用户的新增零售商,而是会筛选出所有不在前周期的零售商(跨用户)。
内容的提问来源于stack exchange,提问作者rg4s
相关产品推荐
相关产品推荐

