Python pandas按ID分组求和后扣除同ID_C其他行值计算新列
Pandas 实现同组排除当前行的聚合计算方案
逻辑拆解
需求可通过pandas原生向量化分组操作实现,不需要逐行遍历,性能高且代码易维护,核心逻辑可做公式简化,避免复杂的"排除自身"操作:
- 同
ID_B+ID_C子组内,除当前行外的其余行Value总和 = 该子组所有行的Value总和 - 当前行自身的Value - 目标列
Value_Sum_New= 已有的ID_B_Value_Sum- 上述其余行Value总和
等价简化公式:Value_Sum_New = ID_B_Value_Sum - (按ID_B、ID_C分组的Value总和 - 当前行Value)
完整实现代码
import pandas as pd # --------------- 构造示例数据 --------------- data = [ [22,5,1,54,208],[23,5,2,34,208],[24,6,1,44,268],[25,6,1,64,268],[26,5,2,35,208], [27,7,3,45,229],[28,7,2,66,229],[29,8,1,76,161],[30,8,2,25,161],[31,6,2,27,268], [32,5,3,14,208],[33,5,3,17,208],[34,6,2,43,268],[35,6,2,53,268],[36,8,1,22,161], [37,7,3,65,229],[38,7,1,53,229],[39,8,2,23,161],[40,8,3,15,161],[41,6,3,37,268], [42,5,2,54,208] ] df = pd.DataFrame(data, columns=['ID_A','ID_B','ID_C','Value','ID_B_Value_Sum']) # --------------- 核心计算逻辑(仅2行)--------------- # 计算ID_B+ID_C子组的Value总和,用transform广播到每一行 df['subgroup_total'] = df.groupby(['ID_B','ID_C'])['Value'].transform('sum') # 套用简化公式计算目标列 df['Value_Sum_New'] = df['ID_B_Value_Sum'] - (df['subgroup_total'] - df['Value']) # 可选:删除临时辅助列 df = df.drop(columns=['subgroup_total']) # 打印结果验证 print(df)
结果验证
运行代码后给出的3个示例行计算结果完全匹配预期:
- 索引2(ID_A=24):
Value_Sum_New=204 - 索引4(ID_A=26):
Value_Sum_New=120 - 索引7(ID_A=29):
Value_Sum_New=139
补充:如果还没有预计算
ID_B_Value_Sum列,也可以用同样的分组逻辑直接生成:df['ID_B_Value_Sum'] = df.groupby('ID_B')['Value'].transform('sum'),不需要额外写聚合逻辑。
内容的提问来源于stack exchange,提问作者LostinSpatialAnalysis
相关产品推荐
相关产品推荐

