Pandas分组多列求最值:计算actual和budget的最小/最大值
解决Pandas分组后从多列生成全局最小/最大值的问题
嘿,我完全懂你遇到的这个坑——你想在每个Measure/measure_group/route的分组里,找出Actual和Budget两列所有值的最小、最大值,但之前的代码因为返回多列结果却要塞进单列里报错了。不用麻烦单独生成DataFrame再合并,这儿有几个简洁的解决方案:
方法1:用transform结合lambda直接计算
这种方法最直观,直接在分组后的两列DataFrame上计算全局的min/max,返回标量后自动广播到分组的每一行:
# 新增min列:每个分组下Actual和Budget所有值的最小值 df_remapped['min'] = df_remapped.groupby(['Measure','measure_group','route'])[['Actual','Budget']].transform( lambda group: group.min().min() ) # 新增max列:每个分组下Actual和Budget所有值的最大值 df_remapped['max'] = df_remapped.groupby(['Measure','measure_group','route'])[['Actual','Budget']].transform( lambda group: group.max().max() )
这里的group.min().min()逻辑是:先算出分组里Actual和Budget各自的列最小值,再从这两个值里取全局最小,这样就得到了该分组两列所有数据的最小值。
方法2:堆叠列后分组统计(更高效)
如果你的数据集比较大,这种方法性能更好,因为它避免了lambda函数的开销:
# 将Actual和Budget列转成长格式,保留分组索引 stacked_data = df_remapped.set_index(['Measure','measure_group','route'])[['Actual','Budget']].stack() # 按原分组索引计算min和max grouped_stats = stacked_data.groupby(level=[0,1,2]).agg(['min', 'max']) # 将统计结果合并回原DataFrame df_remapped = df_remapped.join(grouped_stats, on=['Measure','measure_group','route'])
执行后,原DataFrame会新增min和max两列,对应每个分组的全局最小/最大值。
为什么你之前的代码报错?
你之前写的:
df_remapped['min'] = df_remapped.groupby(['Measure','measure_group','route'])[['Actual','Budget']].transform('min')
问题在于,transform('min')会对Actual和Budget两列分别计算分组最小值,返回的是一个包含两列的DataFrame,但你试图把它赋值给一个单一的min列,Pandas自然会提示“传入了2个元素,但位置只需要1个”的错误。
内容的提问来源于stack exchange,提问作者Greg Williams
相关产品推荐
相关产品推荐

