如何在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
相关产品推荐
相关产品推荐

