Pandas:DataFrameGroupby多列聚合操作报错求助
解决Pandas分组聚合的TypeError问题
咱们一步步拆解这个报错的原因和解决办法:你遇到的TypeError,本质是因为在多列聚合场景下,你用的agg(Avg=np.average, Sum=np.sum)写法不符合Pandas的参数要求——这种关键字参数的格式只适用于单列的命名聚合,多列时必须明确指定聚合函数对应到哪些列。
正确的解决方案
这里提供两种实用写法,你可以根据需求选择:
方案1:明确指定每列的聚合(自定义列名)
如果你想给每个聚合结果设置清晰的自定义列名(比如Avg_POPESTIMATE2010),可以用这种命名聚合的标准写法,每个关键字对应(目标列名, 聚合函数)的元组:
import numpy as np import pandas as pd # 加载并预处理数据 df = pd.read_csv('Data/census.csv') df = df[df['SUMLEV'] == 50] # 正确的聚合代码 result = df.groupby('STNAME')[['POPESTIMATE2010', 'POPESTIMATE2011']].agg( Avg_2010=('POPESTIMATE2010', np.average), Sum_2010=('POPESTIMATE2010', np.sum), Avg_2011=('POPESTIMATE2011', np.average), Sum_2011=('POPESTIMATE2011', np.sum) ) print(result.head())
方案2:批量对多列应用相同聚合(简洁写法)
如果想让选中的所有列自动应用average和sum两个聚合,可以直接传递聚合函数列表,之后再按需合并多级列名:
import numpy as np import pandas as pd df = pd.read_csv('Data/census.csv') df = df[df['SUMLEV'] == 50] # 批量执行聚合 result = df.groupby('STNAME')[['POPESTIMATE2010', 'POPESTIMATE2011']].agg([np.average, np.sum]) # 合并多级列名为单级(比如把('POPESTIMATE2010', 'average')改成'POPESTIMATE2010_average') result.columns = ['{}_{}'.format(col, agg) for col, agg in result.columns] print(result.head())
额外小优化
你原来写的set_index('STNAME').groupby(level=0)可以直接简化成groupby('STNAME'),功能完全一致,代码更简洁易读。
内容的提问来源于stack exchange,提问作者DevPy
相关产品推荐
相关产品推荐

