
本文详解如何在 Pandas 中对指定列(如 ColA)进行分组,并精确统计另一列(如 ColB)中非缺失值(non-null)的数量,确保缺失值(如 NaN)被计为 0,而非被忽略或引发歧义。
本文详解如何在 pandas 中对指定列(如 `cola`)进行分组,并精确统计另一列(如 `colb`)中**非缺失值(non-null)的数量**,确保缺失值(如 `nan`)被计为 0,而非被忽略或引发歧义。
在 Pandas 数据分析中,value_counts() 是快速统计单列频次的常用方法,但它仅作用于目标列本身,不支持跨列条件统计。当需要“按 ColA 分组,并统计每组中 ColB 的有效(非空)记录数”时,直接使用 df.ColA.value_counts() 会遗漏关键逻辑:它完全不感知 ColB 的缺失状态,仅统计 ColA 各取值出现的总行数(含 ColB 为 NaN 的行)。这正是用户示例中 D → 1(实际应为 0)的根本原因。
正确解法是结合 groupby() 与 count() 方法:
result = df.groupby('ColA', as_index=False)['ColB'].count()✅ 关键机制说明:
- df.groupby('ColA') 按 ColA 值划分数据组;
- ['ColB'] 明确选取待统计的列;
- .count() 自动忽略 NaN 值,仅对每组内 ColB 的非空元素计数(这是 Pandas count() 区别于 size() 的核心特性);
- as_index=False 确保结果为标准 DataFrame(ColA 作为普通列而非索引),便于后续处理。
运行上述代码,将精准输出:
ColA ColB 0 A 2 1 B 2 2 C 1 3 D 0
⚠️ 注意事项:
- ❌ 避免误用 .size():df.groupby('ColA')['ColB'].size() 会返回每组总行数(含 NaN),导致 D → 1,不符合需求;
- ❌ 避免链式调用 .value_counts():df.groupby('ColA')['ColB'].value_counts() 返回的是嵌套频次,非分组汇总;
- ✅ 若需同时统计多列非空值,可传入列表:df.groupby('ColA')[['ColB', 'ColC']].count();
- ✅ 如需包含缺失值占比等衍生指标,可在 .count() 基础上结合 .size() 计算:(grouped.count() / grouped.size()).round(2)。
总结:groupby(...)[col].count() 是实现「分组 + 非空值计数」的标准、高效且语义清晰的模式,应作为 Pandas 数据聚合中的基础技能牢固掌握。










