Pandas按列统计annotation=0且值>min_specificity的元素数量
Pandas按条件逐列计数实现方案
问题场景
现有如下构造的测试DataFrame:
import pandas as pd data = [[1, 0, 1, 0, 0], [2, 0, 0.3, 0, 0.6], [3, 0, 0.74, 0, 0.25], [4, 1, 0.9, 0, 0], [5, 1, 1, 0, 0]] df = pd.DataFrame(data, columns=["ID", "annotation", "S1", 'S2', 'S3']) min_specificity = 0.90
需要按列统计同时满足两个条件的元素数量:
- 元素所在行的
annotation列值等于0 - 元素值大于
min_specificity(0.90)
期望输出结构为:
sample count 0 S1 1 1 S2 0 2 S3 0
原有尝试代码df = df[(df >= min_specificity)].count()仅做了值阈值判断,未加入行维度的annotation条件过滤,无法得到正确结果。
实现思路
先做行级过滤,再做列级统计,全程用Pandas向量化运算,不需要写循环:
- 先筛选出
annotation == 0的所有行,直接排除不符合行条件的记录,避免无效计算 - 提取需要统计的S1/S2/S3列,逐元素判断是否大于阈值,得到布尔型矩阵
- 对布尔矩阵按列求和(布尔值
True会被识别为1,False识别为0,求和结果就是该列符合条件的元素数) - 将统计结果重构为
sample、count两列的目标DataFrame格式
可直接运行的代码
# 过滤annotation为0的行 df_filtered = df[df["annotation"] == 0] # 逐列统计符合阈值要求的数量 count_series = (df_filtered[["S1", "S2", "S3"]] > min_specificity).sum() # 转换为目标结构 result = pd.DataFrame({ "sample": count_series.index, "count": count_series.values })
运行后输出和预期结果完全一致。
注意:这里用
.sum()而不是.count()做统计,是因为.count()统计的是非空值数量,虽然当前测试数据无空值时结果一致,但.sum()统计布尔序列中True的个数,语义上和“计数符合条件的元素”完全匹配,逻辑更严谨。
内容的提问来源于stack exchange,提问作者Luis Manuel Quiros guerrero
相关产品推荐
相关产品推荐

