如何使用Pandas新增列实现COUNTIFS多条件计数统计
Pandas实现等价Excel COUNTIFS多条件计数并新增列
针对逐行展示对应主管名下男性员工总数的需求,以下是两种可直接复用的Pandas原生实现方案:
方法1:向量化实现(推荐,大数据量性能最优)
这个方案先统一完成分组统计,再做值映射,不会逐行遍历全表,十万行以上数据也能快速出结果:
import pandas as pd # 第一步:统计每个主管名下的男性员工总数 # 先筛选性别为男的记录,按主管分组计数 male_count = df[df["员工性别"] == "男"].groupby("对应主管姓名")["员工姓名"].count() # 第二步:映射结果到新列,空值填0(对应主管无男性下属的场景),转成整数格式 df["主管名下男性员工总人数"] = df["对应主管姓名"].map(male_count).fillna(0).astype(int)
- 性能优势:全程用Pandas向量化运算,不需要逐行扫描全表,百万行级数据也能秒级返回结果
- 边界处理:
fillna(0)用于覆盖某主管名下没有男性员工的场景,避免新列出现空值,最后转成整数类型更符合计数结果的展示习惯 - 多条件扩展:如果要叠加更多计数规则(比如同时要求入职满1年、绩效为A等),只要在第一步筛选数据时追加对应的布尔判断即可,例:
df[(df["员工性别"] == "男") & (df["入职年限"] >= 1) & (df["绩效等级"] == "A")],和COUNTIFS追加条件的逻辑完全一致
方法2:类Excel公式写法(小数据集可读性最高)
如果数据量不大(10万行以内),可以用和Excel COUNTIFS逻辑完全一致的写法,新手更容易理解和调整条件:
df["主管名下男性员工总人数"] = df.apply( lambda row: ( (df["对应主管姓名"] == row["对应主管姓名"]) & (df["员工性别"] == "男") ).sum(), axis=1 )
- 逻辑对齐Excel:写法和在Excel里写
COUNTIFS(主管列, 当前行主管, 性别列, "男")的思路完全一致,学习成本低 - 适用场景:小数据集下用这个写法几乎感知不到性能差异,调整条件更灵活,每一个
(df["列名"] == 判定值)片段就对应COUNTIFS函数里的一组「条件区域-条件」参数,加新条件时直接用&拼接新判断语句即可
注意:如果源数据里「对应主管姓名」列存在空值,建议先做缺失值填充或者过滤,否则统计时会把空值当作一个独立的主管分组,出现不符合预期的计数结果。
以3列结构的测试数据为例,代码运行后新列的效果参考:
员工姓名 对应主管姓名 员工性别 主管名下男性员工总人数 张A 刘主管 男 3 李B 刘主管 女 3 王C 陈主管 男 1 赵D 刘主管 男 3 孙E 刘主管 男 3 周F 陈主管 女 1
内容的提问来源于stack exchange,提问作者Karthik P H
相关产品推荐
相关产品推荐

