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

