如何用Pandas统计同时拥有指定标识组合的用户ID数量?
问题描述
我有如下所示的DataFrame,需要筛选并统计所有同时拥有title为"banner_click"和"order"的唯一用户。我熟悉SQL中类似UniqExactIf的实现方式,但不清楚如何用Pandas完成该操作。我尝试使用in语句查询,但结果不符合预期,尝试的代码为:
main = df.query("title in ('banner_click','order')").agg({'user':'nunique'})
预期输出为2(user_0和user_2符合条件),可复现示例代码如下:
df = pd.DataFrame({'user': ['user_0', 'user_0', 'user_1', 'user_1', 'user_2', 'user_2'], 'title': ['banner_click', 'order', 'banner_show', 'order', 'order', 'banner_click'] })
对应的DataFrame数据:
user title 0 user_0 banner_click # 同时拥有"banner_click"和"order" 1 user_0 order # 2 user_1 banner_show 3 user_1 order 4 user_2 order # 同时拥有"banner_click"和"order" 5 user_2 banner_click #
解决方案
你之前的代码仅过滤出了title为目标值的记录,但未确保每个用户同时拥有这两种title。以下是几种可行的实现方法:
方法1:分组检查集合包含关系
按user分组后,检查每个用户的title集合是否包含两个目标值,再统计符合条件的用户数:
target_titles = {'banner_click', 'order'} # 分组验证每个用户的title集合是否包含目标集合 valid_users = df.groupby('user')['title'].apply(lambda x: target_titles.issubset(set(x))) # 统计有效用户数量 count = valid_users.sum() print(count) # 输出2
方法2:透视表统计出现次数
用透视表统计每个用户对应各title的出现次数,筛选出两个目标title均至少出现1次的用户:
pivot = df.pivot_table(index='user', columns='title', aggfunc='size', fill_value=0) valid_users = pivot[(pivot['banner_click'] >= 1) & (pivot['order'] >= 1)] count = len(valid_users) print(count) # 输出2
方法3:去重后交叉验证
先对用户-标题组合去重,再统计每个用户拥有的目标title数量,筛选出数量为2的用户:
unique_user_titles = df.drop_duplicates(subset=['user', 'title']) # 统计每个用户的目标title数量 user_title_count = unique_user_titles[unique_user_titles['title'].isin(target_titles)].groupby('user').size() # 筛选出同时拥有两个目标title的用户 count = (user_title_count == 2).sum() print(count) # 输出2
内容的提问来源于stack exchange,提问作者User_001
相关产品推荐
相关产品推荐

