pandas按年月分组聚合时sum正常,使用min报ValueError错误如何解决
问题原因
- 首先是分组键命名冲突:传入
groupby的两个分组维度都是从day_time字段派生的Series,默认两个分组键的名称均为day_time,导致分组后生成的多重索引出现重名层级。sum聚合对这类重名问题的兼容度更高,min/max这类聚合函数的内部处理逻辑会触发索引对齐错误,返回的结果维度和原表20列的预期不符,最终抛出对应错误。 - 其次是未指定聚合列:代码没有在聚合时指定要计算的列,默认会对全表所有列执行聚合,其中原
day_time字段是datetime类型,在min聚合时的返回逻辑和数值列不同,进一步加剧了维度匹配异常。
解决方法
方法1:手动指定分组键名称,避免重名
给派生的分组键手动设置不同的名称后再执行聚合:
data_update = data_update.groupby([ data_update['day_time'].dt.month.rename('month'), data_update['day_time'].dt.year.rename('year') ]).agg('min')
方法2:提前提取月、年字段为独立列再分组
先把年月维度存为DataFrame的独立列,从根源避免分组键重名问题,同时可以按需选择要聚合的列,减少不必要的计算:
# 提取年月维度到新列 data_update['month'] = data_update['day_time'].dt.month data_update['year'] = data_update['day_time'].dt.year # 按新列分组,按需指定要聚合的数值列即可 data_update = data_update.groupby(['year', 'month'])[['需要聚合的列名1', '需要聚合的列名2']].agg('min')
方法3:聚合时筛选列类型
如果不需要保留day_time字段的聚合结果,聚合前先筛选出需要计算的列,排除冲突字段:
data_update = data_update.select_dtypes(include=['number']).groupby([ data_update['day_time'].dt.month, data_update['day_time'].dt.year ]).agg('min')
内容的提问来源于stack exchange,提问作者Catfoxes
相关产品推荐
相关产品推荐

