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
相关产品推荐
相关产品推荐

