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
相关产品推荐
相关产品推荐

