Pandas中groupby()与agg()报错:计算各州CENSUS2010POP的总和与均值
解决Pandas报错"nested renamer is not supported"的方案
嗨,这个问题我之前也踩过坑!报错的核心原因是Pandas版本兼容性问题:从Pandas 0.20.0版本开始,agg()方法不再支持用字典来指定聚合函数与新列名的映射,这就是你看到"nested renamer is not supported"的根源。
下面给你两种可行的解决办法,都能实现按STNAME分组计算CENSUS2010POP的总和与均值:
方法1:使用元组列表指定列名与聚合函数
这是当前Pandas版本推荐的标准写法,直接把(新列名, 聚合函数)作为元组放到列表里传给agg():
import numpy as np import pandas as pd # 先还原你的census DataFrame(如果已经存在可跳过这部分) data = { 'SUMLEV': [50]*9, 'REGION': [3,3,3,4,4,4,4,4,4], 'COUNTY': [1,3,5,3,5,7,21,23,25], 'STNAME': ['Alabama','Alabama','Alabama','Arizona','Arizona','Arizona','California','California','California'], 'CTYNAME': ['Autauga County','Baldwin County','Barbour County','Cochise County','Coconino County','Gila County','Glenn County','Humboldt County','Imperial County'], 'CENSUS2010POP': [54571,182265,27457,131346,134421,53597,28122,134623,174528], 'ESTIMATESBASE2010': [54571,182265,27457,131357,134437,53597,28122,134623,17452] } census = pd.DataFrame(data) # 核心代码 result = census.groupby('STNAME')['CENSUS2010POP'].agg([('avg', np.mean), ('sum', np.sum)]) print(result.head())
如果想保留你原来按索引分组的思路,记得要把set_index的结果赋值(或用链式调用),因为set_index默认不会修改原DataFrame:
result = census.set_index('STNAME').groupby(level=0)['CENSUS2010POP'].agg([('avg', np.mean), ('sum', np.sum)])
方法2:先聚合再重命名列
这种写法更直观,先完成聚合操作得到默认列名,再通过rename()修改为你想要的名称:
# 先聚合得到默认列名mean和sum temp_result = census.groupby('STNAME')['CENSUS2010POP'].agg(['mean', 'sum']) # 重命名列 result = temp_result.rename(columns={'mean': 'avg', 'sum': 'sum'}) print(result.head())
两种方法都能得到你预期的结果:按州分组,每一行对应一个州的人口均值和总和。
内容的提问来源于stack exchange,提问作者Kakarot_7
相关产品推荐
相关产品推荐

