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
目前已完成中间步骤实现:
- 已通过如下代码统计得到每个
P_Id对应的记录行数:data['_Pid_Total'] = data.groupby('P_Id')[['P_Id']].transform('count') - 针对单个
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
相关产品推荐
相关产品推荐

