Python中Pandas groupby.max报错需1个位置参数但传2个,ipynb正常嵌入脚本失效
报错原因
该报错是两个运行环境的pandas版本不一致导致的:
- 本地Jupyter环境使用pandas 1.3.0及以上版本,该版本更新了
groupby对象的聚合方法逻辑,支持直接传入目标列名作为位置参数筛选聚合范围,所以代码可以正常运行 - 嵌入式脚本环境使用的是1.3.0以下版本的pandas,该版本下
groupby.max()、groupby.min()仅支持axis、numeric_only两类参数,不接受列名作为位置参数,因此传入'Delta'或者['Delta']都会触发参数数量不匹配的报错
全版本兼容修复方案
改用兼容所有pandas版本的写法即可,两种常用实现方式:
- 先从groupby结果中筛选目标列,再调用聚合方法:
# 取Delta列最大值 df2.groupby(['A'])['Delta'].max() # 取Delta列最小值 df2.groupby(['A'])['Delta'].min()
- 用
agg方法指定列对应的聚合规则,适合多列执行不同聚合规则的场景:
df2.groupby(['A']).agg({'Delta':'max'})
修改后的完整业务代码如下,可在新旧版本pandas中正常运行:
df3 = df2.merge(df2.groupby(['A'])['Delta'].max().reset_index(),how='left',on='A',suffixes=("","_max")).merge(df2.groupby(['A'])['Delta'].min().reset_index(),how='left',on='A',suffixes=("","_min"))
内容的提问来源于stack exchange,提问作者Mark McGown
相关产品推荐
相关产品推荐

