You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 04:45:04