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

基于条件聚合Pandas子组值:子组值全相同取最大值,存在不同值则求和

Pandas条件子组聚合:同值取最大,异值求和

没问题,我来帮你搞定这个需求!先把规则再明确下:我们需要对DataFrame的子组做聚合——如果子组内所有值都相同,就取该组的最大值(其实和取唯一值结果一致);如果子组里存在不同值,就对所有值求和。

示例数据与预期输出

先拿一组样例数据来演示:

import pandas as pd

df = pd.DataFrame({
    'group': ['A', 'A', 'B', 'B', 'B', 'C'],
    'value': [5, 5, 3, 4, 3, 7]
})

按照规则,预期的聚合结果应该是:

groupresult
A5
B10
C7

解决方案1:直观的apply方法(适合中小数据)

这种写法简单易懂,直接对每个组做判断和聚合,适合数据量不大的场景:

def conditional_agg(group):
    # 判断组内是否所有值都相同
    if group.nunique() == 1:
        return group.max()
    else:
        return group.sum()

# 执行分组聚合并整理结果
result = df.groupby('group')['value'].apply(conditional_agg).reset_index(name='result')
print(result)

nunique()会返回组内唯一值的数量,等于1就说明所有值一致,否则就执行求和操作。


解决方案2:高效的矢量方法(适合大数据)

如果你的数据集很大,apply的逐组循环可能会拖慢速度,我们可以用矢量操作拆分步骤,提升性能:

# 1. 标记每个组是否所有值都相同
group_flags = df.groupby('group')['value'].nunique().reset_index()
group_flags['is_all_same'] = group_flags['value'] == 1

# 2. 分别计算所有组的总和与最大值
group_sum = df.groupby('group')['value'].sum().reset_index(name='sum_val')
group_max = df.groupby('group')['value'].max().reset_index(name='max_val')

# 3. 合并数据并根据标记选择结果
merged = pd.merge(group_flags, group_sum, on='group')
merged = pd.merge(merged, group_max, on='group')
merged['result'] = merged.apply(lambda x: x['max_val'] if x['is_all_same'] else x['sum_val'], axis=1)

# 提取最终结果
final_result = merged[['group', 'result']]
print(final_result)

这种方法把聚合操作拆成了独立的矢量计算,避免了逐组循环,在大数据集上的性能表现会好很多。

两种方法都能满足需求,根据你的数据规模选择就行啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 18:47:33