Pandas按Host分组并针对不同列实现条件计数的方法
按分组条件统计不同列的符合条件数量
问题背景
给定如下示例DataFrame:
import pandas as pd df = pd.DataFrame({'Host': {0: 'N', 1: 'B', 2: 'N', 3: 'N', 4: 'N', 5: 'V', 6: 'B'}, 'Registration': {0: 'Registered', 1: 'MR', 2: 'Registered', 3: 'Registered', 4: '', 5: 'Registered', 6: 'Registered'}, 'Val': {0: 'N', 1: 'B', 2: 'N', 3: 'N', 4: '', 5: 'V', 6: 'B'}, 'Sum': {0: 100.0, 1: 0.0, 2: 300.0, 3: 150.0, 4: 0.0, 5: 0.0, 6: 20.0}})
需求是按Host字段分组计数,针对不同列设置条件:
Registration和Val列统计非空值的数量Sum列统计值大于0.0的数量
期望输出:
Registration Val Sum Host B 2 2 1 N 3 3 3 V 1 1 0
用户尝试以下代码未达预期,输出与df.groupby("Host").count()一致:
df.groupby("Host").agg({'Registration': lambda x: (x != "").count(), 'Val':lambda x: (x != "").count(), 'Sum': lambda x: (x != 0).count()})
错误原因
原代码中使用的.count()方法会返回整个分组序列的元素总数,并不会统计布尔数组中True的数量。我们需要的是统计条件满足(即布尔值为True)的条目数,应该用.sum()方法——因为布尔值在计算时会被转换为1(True)和0(False),求和即可得到符合条件的数量。
可行实现方案
方案一:修改lambda中的统计方法
将原代码中的.count()替换为.sum(),同时注意Sum列的条件应该是x > 0.0(精准匹配需求中的"大于0.0",避免包含负数情况):
result = df.groupby("Host").agg( Registration=lambda x: (x != "").sum(), Val=lambda x: (x != "").sum(), Sum=lambda x: (x > 0.0).sum() ) print(result)
方案二:使用Pandas内置方法(更直观)
利用Pandas的ne(不等于)和gt(大于)方法替代手动比较,代码可读性更强:
agg_funcs = { 'Registration': lambda x: x.ne("").sum(), 'Val': lambda x: x.ne("").sum(), 'Sum': lambda x: x.gt(0.0).sum() } result = df.groupby("Host").agg(agg_funcs) print(result)
两种方案都能得到符合预期的输出结果。
内容的提问来源于stack exchange,提问作者Xbel
相关产品推荐
相关产品推荐

