如何在Pandas中按唯一user_id统计各部门独立用户数?
解决按唯一user_id统计宠物用品购买用户的方法
核心思路
要区分订单数和唯一用户数,关键是先按user_id聚合,判断每个用户是否存在宠物用品购买记录,再做统计。
高效解决方案(适配大型数据集)
针对3200万条记录的大数据集,推荐用分组聚合的方式直接标记用户属性,避免内存浪费:
# 按user_id分组,判断该用户是否有过宠物用品订单 user_pet_status = df.groupby('user_id')['department'].apply( lambda x: 'Yes' if (x == 'pets').any() else 'No' ).reset_index(name='pet_owner') # 统计购买/未购买宠物用品的唯一用户数量 user_pet_status['pet_owner'].value_counts(dropna=False)
这个方法直接在分组时完成判断,不需要额外创建大集合,性能更优。
分步实现(适合理解逻辑)
- 提取买过宠物用品的唯一用户ID
# 保留Pandas Series/numpy数组格式,不要转成list pet_user_ids = df[df['department'] == 'pets']['user_id'].unique()
- 给每个用户标记宠物主人属性
# 对每个user_id判断是否在宠物用户集合中 df['pet_owner'] = df['user_id'].map(lambda x: 'Yes' if x in pet_user_ids else 'No') # 提取唯一用户的属性记录(去掉重复的订单行) user_pet_status = df[['user_id', 'pet_owner']].drop_duplicates()
- 统计用户数量
user_pet_status['pet_owner'].value_counts(dropna=False)
之前错误的原因说明
- 把
unique()结果转成list后,list没有value_counts方法,直接用len(pet_user_ids)就能得到购买宠物用品的唯一用户数; groupby('user_id').agg({'pet_owner' : 'count'})统计的是每个用户的订单行数,而非是否存在宠物用品购买行为,应该用any()判断属性是否存在。
内容的提问来源于stack exchange,提问作者Julie Whitton
相关产品推荐
相关产品推荐

