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

如何按指定列分组后统计唯一ID数并基于唯一ID计算Activity聚合值?

解决方案

需求拆解

你需要的activity聚合逻辑核心是:先对每个唯一id取其对应的activity最大值(只要该id下存在至少一个activity=1,就计为1,否则为0),再对分组内的这些值求和。对应示例数据:

  • 用户1的id=1对应activity最大值1,id=2对应0,总和为1
  • 用户2的id=3对应1,id=4对应1(该id下存在activity=1),总和为2

实现代码

提供两种高效实现方式:

方式1:先预处理再聚合(性能更优)

先对id去重并保留每个id的最大activity值,再进行分组统计:

# 按usr、gp2、gp3、id分组,提取每个id的最大activity值
id_level_data = df.groupby(['usr', 'gp2', 'gp3', 'id'])['activity'].max().reset_index()
# 按usr、gp2、gp3分组计算最终结果
result = id_level_data.groupby(['usr', 'gp2', 'gp3']).agg(
    id=('id', 'nunique'),
    Activity=('activity', 'sum')
).reset_index()

方式2:自定义聚合函数(直接复用你的原有代码结构)

在你已有的groupby.agg结构中,通过自定义函数实现逻辑:

def calculate_activity(x):
    # 结合当前分组内的id,先取每个id的最大activity,再求和
    return x.groupby(df.loc[x.index, 'id']).max().sum()

# 应用自定义聚合逻辑
result = df.groupby(['usr', 'gp2', 'gp3']).agg(
    id=('id', pd.Series.nunique),
    Activity=('activity', calculate_activity)
).reset_index()

最终输出

两种方式都会生成你期望的结果:

usr gp2   gp3  id  Activity
0    1  IN  ASIA   2         1
1    2  IN  ASIA   2         2

内容的提问来源于stack exchange,提问作者ggupta

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 16:35:15