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

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向量化运算,不需要写循环:

  1. 先筛选出annotation == 0的所有行,直接排除不符合行条件的记录,避免无效计算
  2. 提取需要统计的S1/S2/S3列,逐元素判断是否大于阈值,得到布尔型矩阵
  3. 对布尔矩阵按列求和(布尔值True会被识别为1,False识别为0,求和结果就是该列符合条件的元素数)
  4. 将统计结果重构为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 17:42:24