如何按指定列分组后统计唯一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
相关产品推荐
相关产品推荐

