使用列运算符检查通过还是失败

问题描述

我不确定是否可以使用operators列返回一个熊猫系列,该系列将根据其通过分数,运算符和实际值来确定某行的活动是通过还是失败。

数据集示例:

data={"ID": [1,1,2,2],"Activity": ["Quiz","Attendance","Quiz","Attendance"],"Passing Score": [80,80,"Operator": [">=","<=",">=","<="],"Actual": [79,82,3]
     }
data = pd.DataFrame(data)

它是什么样的:

ID  Activity    Passing Score   Operator    Actual
1   Quiz        80              >=          79
1   Attendance  2               <=          0
2   Quiz        80              >=          82
2   Attendance  2               <=          3

我的解决方案:

def score(pass_score,operator,actual):
    """
    pass_score: pandas Series,passing Score
    operator: pandas Series,operator
    actual: pandas Series,actual Score
    """
    
    the_list=[]
    
    for a,b,c in zip(pass_score,actual):
        if b == ">=":
            the_list.append(c >= a)
        elif b == "<=":
            the_list.append(c <= a)
    
    mapper={True: "Pass",False: "Fail"
           }
    
    return pd.Series(the_list).map(mapper)

data["Peformance Tag"] = score(data["Passing Score"],data["Operator"],data["Actual"])

我想要实现的目标(如果可能的话,可以通过使用字典来缩短我的代码):

operator_map = {">=": >=,"<=": <=,}

data["Peformance Tag"] =  data[["Passing Score","Operator","Actual"]].apply(lambda x: x[0] operator_map[x[1]]  x[2],axis=1)

解决方法

您可以这样做:

data[['Passing Score','Operator','Actual']].astype(str).sum(axis=1).apply(eval)

但是说实话,我不会太相信这种编程。我觉得您的数据框可以通过两列来更有意义地重塑:

  • Actual_quiz
  • 实际出勤

然后您可以做:

data['Actual_quiz'] =< 80

以此类推。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...