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

Pandas groupby配合agg自定义函数聚合计数结果异常求解

Pandas分组聚合统计True值计数方案

问题背景

现有CSV数据样例如下:

key1    key2    Key3    key4    key5
Val1    A        51     'True'  25
Val1    A        50     'False' 25
Val1    A        49     'True'  25
Val1    A        48     'True'  25
Val2    A        47     'False' 25
Val2    A        46     'True'  25
Val2    A        45     'False' 25
Val2    A        44     'True'  25
Val2    A        43     'True'  25

需要按key1、key2字段分组,输出以下统计结果:

key1 key2 max_key5 total_key4 total_true_key4
Val1  A   51       4          3
Val2  A   47       5          3 

统计规则:

  • 计算每组key5字段的最大值
  • 统计每组key4字段的总记录数
  • 统计每组key4字段值为True的记录总数

原有代码错误点

你之前编写的两段代码无法得到正确结果,原因如下:

  • 匹配条件错误:key4字段存储的是带单引号、首字母大写的字符串'True'/'False',既不是全大写字符串'TRUE',也不是Python原生布尔值True,判断条件无法命中目标值。
  • 聚合逻辑错误:x == 目标值返回的是布尔型序列,必须对序列求和才能得到True的个数(布尔运算中True等价于1,False等价于0,求和结果就是符合条件的记录数);直接调用count()会统计所有非空值,直接返回布尔序列不符合聚合函数需返回单值的要求。
  • 第二段代码分组字段错误:需求要求按key1、key2分组,代码中写的["section","row"]和实际字段名不匹配。

正确实现代码

直接运行以下代码即可得到预期结果:

import pandas as pd

result = json_data.groupby(["key1", "key2"], as_index=False).agg(
    max_key5=("key5", "max"),
    total_key4=("key4", "count"),
    # 注意如果你的key4值不带外层单引号,就把匹配值改成"True"
    total_true_key4=("key4", lambda x: (x == "'True'").sum())
)
print(result)

如果想要后续计算更简洁,可以先把key4字段清洗为原生布尔类型再聚合:

# 清洗key4字段:去掉外层单引号,转换为布尔值
json_data["key4"] = json_data["key4"].str.strip("'").map({"True": True, "False": False})

result = json_data.groupby(["key1", "key2"], as_index=False).agg(
    max_key5=("key5", "max"),
    total_key4=("key4", "count"),
    total_true_key4=("key4", "sum")
)
print(result)

内容的提问来源于stack exchange,提问作者Md. Parvez Alam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 05:03:19