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

Pandas使用Lambda计算分组后极值差(Range)失败问题排查

解决Pandas Groupby计算Range列的问题

你的代码存在几个问题:

  • 拼写错误:lamda 应该是 lambda,这是直接导致函数无法运行的语法错误
  • 自定义聚合函数没有指定列名,运行后会显示<lambda>而非预期的Range
  • 缺少预期输出中的min字段计算
  • 代码语法不完整,缺少闭合的大括号和括号

正确实现代码

下面两种方式都能得到你要的结果:

方式1:使用命名聚合(Pandas 0.25+推荐)

这种方式更直观,直接指定每列的名称和对应的聚合方法:

import pandas as pd

# 构造输入数据
data = [
    ["Boy", 34], ["Girl", 56], ["Boy", 65], ["Girl", 76],
    ["Boy", 43], ["Girl", 45], ["Boy", 67], ["Girl", 90],
    ["Boy", 89], ["Girl", 45], ["Boy", 23], ["Girl", 56],
    ["Boy", 67], ["Girl", 77], ["Boy", 88], ["Girl", 35],
    ["Boy", 40]
]
df = pd.DataFrame(data, columns=["boyorgirl", "testscore"])

# 分组计算
df3 = df.groupby('boyorgirl')['testscore'].agg(
    sum='sum',
    max='max',
    mean='mean',
    min='min',
    Range=lambda x: x.max() - x.min()
)
# 调整列顺序匹配预期输出
df3 = df3[['mean', 'sum', 'min', 'max', 'Range']]
print(df3.round(4))

方式2:使用字典式聚合并重命名列

如果习惯用字典格式,可以给每个聚合方法指定元组(列名,方法),再扁平化列索引:

import pandas as pd

# 构造输入数据(同上)
data = [
    ["Boy", 34], ["Girl", 56], ["Boy", 65], ["Girl", 76],
    ["Boy", 43], ["Girl", 45], ["Boy", 67], ["Girl", 90],
    ["Boy", 89], ["Girl", 45], ["Boy", 23], ["Girl", 56],
    ["Boy", 67], ["Girl", 77], ["Boy", 88], ["Girl", 35],
    ["Boy", 40]
]
df = pd.DataFrame(data, columns=["boyorgirl", "testscore"])

# 分组计算
df3 = df.groupby(['boyorgirl']).agg({
    'testscore': [
        ('mean', 'mean'),
        ('sum', 'sum'),
        ('min', 'min'),
        ('max', 'max'),
        ('Range', lambda x: x.max() - x.min())
    ]
})
# 把多层列索引转为单层
df3.columns = df3.columns.get_level_values(1)
print(df3.round(4))

运行结果

两种方式都会得到和你预期一致的输出:

mean  sum  min  max  Range
boyorgirl                         
Boy     57.3333  516   23   89     66
Girl    60.0000  480   35   90     55

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 03:50:16