Pandas分组条件求和:新增TYPE为A/B的分组求和列
解决方案:新增
TOT_AB列计算指定TYPE的分组求和 要实现按IDS分组,仅对TYPE为A或B的CR_EARNED求和并生成TOT_AB列,这里有两种简洁且易理解的方法,和你生成TOT_ALL_TYPES的思路一脉相承:
方法一:临时列辅助法(直观易懂)
先给符合条件的行标记出有效CR_EARNED值,再分组求和映射回原表:
# 创建临时列,仅保留TYPE为A/B的CR_EARNED,其余设为0 df['CR_AB_temp'] = df.apply(lambda row: row['CR_EARNED'] if row['TYPE'] in ['A', 'B'] else 0, axis=1) # 按IDS分组求和临时列,生成目标TOT_AB df['TOT_AB'] = df['CR_AB_temp'].groupby(df['IDS']).transform('sum') # 可选:删除临时列,保持表结构整洁 df = df.drop('CR_AB_temp', axis=1)
方法二:直接分组筛选法(更简洁)
不需要临时列,直接在分组后对每组内符合条件的行求和:
df['TOT_AB'] = df.groupby('IDS')['CR_EARNED'].transform( lambda x: x[df.loc[x.index, 'TYPE'].isin(['A', 'B'])].sum() )
最终效果验证
运行任意一种方法后,你的DataFrame会得到期望的结果:
IDS CR_EARNED TYPE TOT_ALL_TYPES TOT_AB
001 3 A 7 7
001 3 A 7 7
001 1 B 7 7
002 3 A 6 6
002 3 A 6 6
003 2 C 8 2
003 4 C 8 2
003 2 A 8 2
举个例子:IDS=003的分组里只有TYPE为A的行(CR_EARNED=2)符合条件,所以TOT_AB的值为2,所有同IDS的行都会映射这个求和结果。
内容的提问来源于stack exchange,提问作者S_TAN
相关产品推荐
相关产品推荐

