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

使用relativedelta列分组DataFrame时遇TypeError问题求助

问题描述

我有一个包含dateutil.relativedelta类型列的DataFrame,尝试按该列分组时出现错误:TypeError: '<' not supported between instances of 'relativedelta' and 'relativedelta'。查阅pandas官方文档未发现分组列类型限制,请问我遗漏了什么?

最小复现代码

from dateutil.relativedelta import relativedelta
import pandas as pd
import itertools

def expand_grid(data_dict):
    rows = itertools.product(*data_dict.values())
    return pd.DataFrame.from_records(rows, columns=data_dict.keys())

ref_dates = pd.date_range(start="2024-06", end="2025-02", freq="MS").tolist()
windows = [relativedelta(months=-30),relativedelta(months=-18)]
max_horizon = [relativedelta(months=2)]  
params = expand_grid({'ref_date': ref_dates, 'max_horizon': max_horizon, 'window': windows})

for name, group in params.groupby(by=['window']): print(name)

问题原因与解决方案

核心原因

Pandas的groupby操作默认会对分组键进行排序,而dateutil.relativedelta对象仅实现了相等性判断(==、!=),未实现<、>这类排序所需的比较运算符,因此触发类型错误。官方文档未明确标注该限制,是因为它默认分组键需满足可哈希且支持排序比较的隐含要求,而relativedelta不满足后者。

两种可行解决方案

  • 方案一:跳过排序步骤
    groupby提供了sort=False参数,设置后会跳过排序逻辑,仅依赖哈希分组(relativedelta支持哈希操作),直接完成分组:

    for name, group in params.groupby(by=['window'], sort=False):
        print(name)
    
  • 方案二:转换为可比较的类型
    将relativedelta转换为能代表其属性的数值或元组,比如提取总月数,用转换后的列分组:

    # 提取relativedelta的月数作为分组键
    params['window_month'] = params['window'].apply(lambda x: x.months)
    for name, group in params.groupby(by=['window_month']):
        print(name)
    

说明

方案一更直接,适合仅需分组、无需有序结果的场景;方案二彻底解决比较问题,适合需要对分组键进行后续排序或数值运算的场景。

内容的提问来源于stack exchange,提问作者user5029763

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 05:12:37