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

求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)

代码逻辑解析

  1. 分组筛选:按Group列分组后,筛选出每组中大于0的数值;
  2. 特殊情况处理:如果组内无正值,返回0(可根据实际需求调整);
  3. 核心计算:计算正值总和,再根据正值数量判断:
    • 仅1个正值时,直接返回总和;
    • 多个正值时,用总和减去最大值;
  4. 结果整理:将分组计算结果转换为目标格式的DataFrame。

运行代码后会输出目标结果:

Group  Sum
0     A   16
1     B   74
2     C   24
3     D   49

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 17:55:47