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

Pandas基于条件的Groupby与Aggregate报错求助:按组计算Flag及对应Value求和

问题解决:按分组计算Flag对应Value总和及Flag总和

原始数据

import pandas as pd

df=pd.DataFrame({'ID':['A','B','C','D'],
                 'Group':['group1','group1','group2','group2'],
                 'Flag_1':[1,0,0,1],
                 'Flag_2':[1,1,0,1],
                 'Value':[30,40,60,70]
                })

期望输出

df_value_group=pd.DataFrame({
                 'Flag_1 Sum':[1,1],
                 'Flag_2 Sum':[2,1],
                 'Value_1 Sum':[30,70],
                 'Value_2 Sum':[70,70]},                 
    index=['group1','group2'])

错误代码及问题点

你尝试的代码中,后两个lambda函数直接引用全局df,导致维度不匹配抛出AssertionError:

df.groupby('Group').agg(
    **{ 'Flag_1 Sum': ('Flag_1','sum'),
        'Flag_2 Sum': ('Flag_2','sum'),
        'Value_1 Sum': ('Flag_1', lambda col: df.loc[col.eq(1), 'Value'].sum()),
        'Value_2 Sum': ('Flag_2', lambda col: df.loc[col.eq(1), 'Value'].sum())
})

错误原因:分组后的col是组内的Series,col.eq(1)的索引仅对应组内行,但df.loc会匹配全局DataFrame的索引,导致筛选结果与组内数据维度不匹配。

正确解决方案

方法1:使用apply处理每个分组

通过自定义函数处理单个分组,直接操作组内数据:

def process_group(group):
    return pd.Series({
        'Flag_1 Sum': group['Flag_1'].sum(),
        'Flag_2 Sum': group['Flag_2'].sum(),
        'Value_1 Sum': group.loc[group['Flag_1'] == 1, 'Value'].sum(),
        'Value_2 Sum': group.loc[group['Flag_2'] == 1, 'Value'].sum()
    })

df_value_group = df.groupby('Group').apply(process_group)

方法2:在agg中使用分组全局数据

调整lambda参数,直接接收整个分组数据而非单列:

df_value_group = df.groupby('Group').agg(
    **{
        'Flag_1 Sum': ('Flag_1', 'sum'),
        'Flag_2 Sum': ('Flag_2', 'sum'),
        'Value_1 Sum': (lambda g: g.loc[g['Flag_1'] == 1, 'Value'].sum()),
        'Value_2 Sum': (lambda g: g.loc[g['Flag_2'] == 1, 'Value'].sum())
    }
)

两种方法均能得到符合预期的输出结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 11:33:16