使用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
相关产品推荐
相关产品推荐

