Python Pandas 按Category分组统计月份字段出现次数问题
代码错误原因
你编写的统计代码存在3个致命问题,无法正常执行:
- 列筛选语法错误:
df_sum[df_sum['Month value']]这类写法是将列的取值作为列名做筛选,会直接触发KeyError,无法获取到行维度的具体数值 - 逻辑运算用法错误:pandas中长度不匹配的数组不能直接用原生
and做逐元素逻辑与,逐元素与运算需要用&运算符,且源表piv_1和汇总表df_sum行数不一致,直接做等值对比会触发维度不匹配报错 - 统计逻辑错误:原生Python的
sum()函数无法实现跨表维度匹配的分组计数需求,不能直接用来给汇总表赋值。
可行实现方案
以下两种方案都可以直接复用,不需要逐字段重复写冗余逻辑:
方案1:长表转换透视(推荐,代码简洁)
核心思路是先把三个需要统计的月份字段统一转换为长格式,一次分组统计完所有字段的计数,再对齐到你预先建好的df_sum空表结构:
import pandas as pd # 宽表转长表,把三个月份列的取值统一收拢 long_piv = piv_1.melt( id_vars="Category", value_vars=["Start", "Issue", "Comments Rec"], var_name="stat_col", value_name="Month value" ) # 按分类、月份、字段名三维度分组计数,宽表展开得到统计结果 stat_result = long_piv.groupby( ["Category", "Month value", "stat_col"] ).size().unstack(fill_value=0).reset_index() # 和原有空汇总表对齐,缺失的组合补0,保留原有表结构 df_sum = df_sum[["Category", "Month value"]].merge( stat_result, on=["Category", "Month value"], how="left" ).fillna(0) # 按需调整列顺序 df_sum = df_sum[["Category", "Month value", "Start", "Issue", "Comments Rec"]]
方案2:索引匹配赋值(适配逐列统计的思路)
如果你更习惯逐字段统计,可以通过联合索引匹配的方式赋值,逻辑更直观:
# 把汇总表的维度列设为联合索引,方便匹配赋值 df_sum = df_sum.set_index(["Category", "Month value"]) # 循环处理三个统计字段,不需要重复写逻辑 for col_name in ["Start", "Issue", "Comments Rec"]: # 统计当前字段下,每个分类+月份的出现次数 count_series = piv_1.groupby(["Category", col_name]).size() # 按汇总表的索引对齐计数结果,缺失值补0后赋值 df_sum[col_name] = count_series.reindex(df_sum.index, fill_value=0).values # 重置索引恢复普通DataFrame结构 df_sum = df_sum.reset_index()
逻辑验证
用测试样例验证:
当piv_1存在如下2条记录时:
- 记录1:Category=3.0,Start=1,Issue=2,Comments Rec=1
- 记录2:Category=3.0,Start=1,Issue=1,Comments Rec=2
统计后df_sum中Category=3.0、Month value=1的行,Start计数值为2,Issue计数值为1,Comments Rec计数值为1,和预期结果完全一致。
内容的提问来源于stack exchange,提问作者MJKing
相关产品推荐
相关产品推荐

