You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 17:52:18