求DataFrame各组中除最大值外所有正值的和
需求说明
现有如下DataFrame:
Group Val1 Val2 Val3 Val4 A -94 96 16 -92 B 30 59 -10 44 C 50 -18 -30 24 D 61 49 -15 -95
需要计算每组中所有正值的和,但需排除该组的最大正值,最终得到结果如下:
Group Sum A 16 B 74 C 24 D 49
规则说明:
- A组排除最大正值96,仅保留16求和,结果为16;
- B组排除最大正值59,用30和44求和,结果为74;
- 若组内仅有1个正值,则直接保留该值计入求和。
实现方法(Pandas)
可以通过自定义分组逻辑完成需求,代码及说明如下:
import pandas as pd # 构造原始DataFrame df = pd.DataFrame({ 'Group': ['A', 'B', 'C', 'D'], 'Val1': [-94, 30, 50, 61], 'Val2': [96, 59, -18, 49], 'Val3': [16, -10, -30, -15], 'Val4': [-92, 44, 24, -95] }) # 定义每组的计算逻辑 def calc_sum_excl_max_pos(group): # 筛选当前组的所有正值 positives = group[group > 0] # 无正值时返回0,可按需调整 if len(positives) == 0: return 0 total_pos = positives.sum() max_pos = positives.max() # 仅1个正值时直接返回总和,否则用总和减去最大值 return total_pos if len(positives) == 1 else total_pos - max_pos # 分组计算并整理结果 result = df.groupby('Group')[['Val1', 'Val2', 'Val3', 'Val4']].apply(calc_sum_excl_max_pos).reset_index(name='Sum') print(result)
代码逻辑解析
- 分组筛选:按
Group列分组后,筛选出每组中大于0的数值; - 特殊情况处理:如果组内无正值,返回0(可根据实际需求调整);
- 核心计算:计算正值总和,再根据正值数量判断:
- 仅1个正值时,直接返回总和;
- 多个正值时,用总和减去最大值;
- 结果整理:将分组计算结果转换为目标格式的DataFrame。
运行代码后会输出目标结果:
Group Sum 0 A 16 1 B 74 2 C 24 3 D 49
内容的提问来源于stack exchange,提问作者Zanam
相关产品推荐
相关产品推荐

