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

Pandas GroupBy使用transform实现按E_Id分组统计P_Id关联总数

问题描述

现有包含Index、E_Id、P_Id、Date四个字段的测试数据集,共7条记录,需创建按E_Id分组的统计结果,统计逻辑如下:

  • 第一步:统计每个P_Id对应的记录行数,记为x
  • 第二步:对每个E_Id关联的所有P_Id对应的x值求和,生成TotalOfPIds字段,例:E_Id为701时对应的统计结果为6

目前已完成中间步骤实现:

  1. 已通过如下代码统计得到每个P_Id对应的记录行数:
    data['_Pid_Total'] = data.groupby('P_Id')[['P_Id']].transform('count')
    
  2. 针对单个E_Id(如取值为701),可通过如下代码得到单个整数的统计结果:
    data.loc[data['E_Id'] == '701', ['E_Id', 'P_Id', '_Pid_Total']].groupby(['E_Id', 'P_Id']).first().sum()
    

当前待实现需求:完成全量DataFrame的批量统计,优先使用transform方法或其他高效计算方案。

实现方案

你之前单值计算时先按E_Id、P_Id分组取first(),本质是避免同一个P_Id对应的x值被重复累加,把这个逻辑扩展到全量数据即可,两种高效向量化实现方式可选:

  • 方式1:全流程使用transform实现,直接在原DataFrame上新增结果列,无需额外合并
    # 先取每个E_Id下不同P_Id对应的唯一_Pid_Total值,再按E_Id分组求和
    data['TotalOfPIds'] = data.groupby(['E_Id', 'P_Id'])['_Pid_Total'].transform('first').groupby(data['E_Id']).transform('sum')
    
  • 方式2:先聚合生成按E_Id分组的独立统计DataFrame,按需合并回原表
    # 生成E_Id维度的聚合结果表
    eid_agg = data.groupby(['E_Id', 'P_Id'])['_Pid_Total'].first().groupby(level='E_Id').sum().reset_index(name='TotalOfPIds')
    # 如需把统计结果匹配回原表,执行merge即可
    data = data.merge(eid_agg, on='E_Id', how='left')
    

两种实现都是pandas原生向量化计算,无循环逻辑,数据量较大时也能保持不错的运行效率。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 22:57:25