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

如何在Pandas DataFrame中按不同阈值条件统计达标次数?

在Pandas DataFrame中新增列统计每行满足阈值条件的次数

需求

要给Pandas DataFrame加一列Threshold_Met_Count,统计每行里Data1、Data2、Data3满足对应阈值条件的次数:

  • 当Metric是M1、M2时,统计数据≥阈值的列数
  • 当Metric是M3、M4时,统计数据≤阈值的列数

原始数据结构

Number Metric  Threshold   Data1    Data2   Data3
  1     'M1'      10         12       8       11
  2     'M2'      20         20       14       1
  3     'M3'      30         50       22      44
  4     'M4'      40         39       28      41

预期输出

Number Metric  Threshold   Data1    Data2   Data3  Threshold_Met_Count
  1     'M1'     10         12       8       11        2
  2     'M2'     20         20       14       1        1
  3     'M3'     30         50       22      44        1
  4     'M4'     40         39       28      41        2

问题排查与解决

一开始尝试用字典存条件再循环对比,没做出来。后来用@mozway的方案,结果报错:

TypeError: '>=' not supported between instances of 'float' and 'str'

原方案代码:

mask1 = df['Metric'].isin(['M1', 'M2'])
mask2 = df['Metric'].isin(['M3', 'M4'])

df2 = df.filter(like='Data')
df['Threshold_Met_Count'] =  (
   df2[mask1].ge(df['Threshold'], axis=0).sum(axis=1)
  +df2[mask2].le(df['Threshold'], axis=0).sum(axis=1)
 )

错误原因:Metric列的字符串带单引号(比如'M1'),导致isin没匹配到对应行,后续比较时出现浮点型和字符串的类型不兼容问题。

改成用Number列区分两组条件,同时把Data*列转成浮点型,修正后的代码就能正常运行得到预期结果:

mask1 = df['Number'].isin([1, 2])
mask2 = df['Number'].isin([3, 4])

df2 = df.filter(like='Data').astype(float)
df['Threshold_Met_Count'] =  (
   df2[mask1].ge(df['Threshold'], axis=0).sum(axis=1)
  +df2[mask2].le(df['Threshold'], axis=0).sum(axis=1)
 )

内容的提问来源于stack exchange,提问作者newbie

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 17:42:14