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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 04:35:25