如何使用Pandas NamedAgg对多列分组聚合实现按季度统计数据
问题解决
报错原因
pd.NamedAgg的column参数仅支持传入单个可哈希的列名字符串,你传入的列名列表属于不可哈希类型,因此触发TypeError: unhashable type: 'list'错误。此外你硬编码列索引切片的方式兼容性极差,只要列顺序、日期范围发生变动,统计结果就会出错。
推荐实现方案(无需硬编码列索引)
直接利用日期本身的季度属性做聚合,逻辑更严谨,适配性更强:
import pandas as pd # 宽表转长表,保留分组字段city、zip df_long = df.melt(id_vars=['city', 'zip'], var_name='date', value_name='daily_value') # 转换日期格式,生成季度标识 df_long['date'] = pd.to_datetime(df_long['date']) df_long['quarter'] = df_long['date'].dt.year.astype(str) + '_q' + df_long['date'].dt.quarter.astype(str) # 分组聚合后转回宽表格式 result = df_long.groupby(['city', 'zip', 'quarter'])['daily_value'].sum()\ .unstack(level='quarter').reset_index()
快速适配原有切片逻辑的方案
如果你确定要沿用当前的列索引切片规则,可通过构造自定义聚合规则实现需求:
# 定义每个季度对应的列切片和聚合函数 quarter_config = [ ('2021_q1', df.columns[1:89].tolist()), ('2021_q2', df.columns[90:180].tolist()), ('2021_q3', df.columns[181:240].tolist()), ('2021_q4', df.columns[241:380].tolist()), ('2022_q1', df.columns[381:450].tolist()), ] # 生成聚合规则并执行计算 result = df.groupby(['city','zip']).agg(**{ q_name: (q_cols[0], lambda x, cols=q_cols: x[cols].sum(axis=1)) for q_name, q_cols in quarter_config })
内容的提问来源于stack exchange,提问作者hemz
相关产品推荐
相关产品推荐

