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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 08:00:58