使用pd.Grouper分组时报错:Period type不支持sum操作及结果异常求助
问题解决思路
1. 报错原因分析
原代码报错TypeError: Period type does not support sum operations,是因为groupby().sum()默认会对所有列执行求和操作,而你的数据中存在Period类型的列(大概率是分组后的PuDate列被转为Period类型,或其他列是Period类型),Period类型不支持sum运算。
2. 修正代码(还原原逻辑)
原代码核心逻辑是按月份+司机分组,对数值型指标求和,你需要明确指定要求和的数值列,避免对Period类型列执行sum:
方法1:手动指定数值列
假设数据中需要求和的指标是订单量、营收这类数值列,直接在groupby后指定这些列:
# 替换为你实际需要求和的数值列名 source = rankdf.groupby([pd.Grouper(freq='1M', key='PuDate'), 'Driver'])[['订单量', '营收']].sum().reset_index()
方法2:自动筛选数值列
如果不确定哪些是数值列,可以自动排除Period类型的列:
# 筛选出非Period类型的数值列,排除分组键Driver numeric_cols = rankdf.select_dtypes(exclude=['period']).drop('Driver', axis=1).columns source = rankdf.groupby([pd.Grouper(freq='1M', key='PuDate'), 'Driver'])[numeric_cols].sum().reset_index()
3. 为什么修改后的代码可视化异常?
你修改的代码groupby(pd.Grouper(freq='1M',key='PuDate'))['Driver'].sum().reset_index()逻辑完全偏离原需求:
- 原逻辑是每个月每个司机的指标求和,得到多组(司机)每月的数值,适合做排名类图表
- 修改后的逻辑是每个月对Driver列求和,若Driver为字符串类型会报错,若为数值类型则得到每月所有司机的指标总和,结果是单条时间序列,所以可视化成了直线图
内容的提问来源于stack exchange,提问作者MrEvo
相关产品推荐
相关产品推荐

