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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 09:32:46