Python Pandas如何根据缺勤条件为DataFrame填充attendence_score列
出勤分数计算实现方案
你可以直接用pandas内置的分箱或条件匹配函数实现,不需要写多层嵌套if判断,以下是两种可直接运行的实现方式:
方案1:使用pd.cut(推荐,最适配区间映射需求)
这类连续区间映射的场景是pd.cut的典型适用场景,代码简洁易维护:
import pandas as pd import numpy as np # 定义区间边界,默认右闭,刚好匹配你的规则:(-1,0]对应0缺勤,(0,5]对应1-5缺勤,以此类推 bins = [-1, 0, 5, 10, 15, 20, np.inf] # 定义每个区间对应的分数,顺序和区间一一对应 score_labels = [5, 4, 3, 2, 1, 0] # 生成新列,astype(int)是将返回的分类类型转为整数方便后续计算 df['attendence_score'] = pd.cut(df['absenses'], bins=bins, labels=score_labels).astype(int)
如果你的absenses字段存在空值,可在末尾加.fillna(0)将空值对应的出勤分设为0。
方案2:使用np.select(适合偏好条件判断写法的场景)
如果你更习惯用条件判断的逻辑实现,可以用np.select替代多层if嵌套,可读性更高:
import numpy as np # 定义所有匹配条件,顺序和分数一一对应 conditions = [ df['absenses'] == 0, df['absenses'].between(1, 5), df['absenses'].between(6, 10), df['absenses'].between(11, 15), df['absenses'].between(16, 20), df['absenses'] >= 21 ] # 定义条件对应的分数 scores = [5, 4, 3, 2, 1, 0] df['attendence_score'] = np.select(conditions, scores)
如果需要处理空值,可添加default=0参数将未匹配到条件(含空值)的行默认设为0分:
df['attendence_score'] = np.select(conditions, scores, default=0)
内容的提问来源于stack exchange,提问作者TIAN XIA
相关产品推荐
相关产品推荐

