如何在Python(Pandas)中不使用if-elif实现分数到等级的多条件映射
不用if-elif实现多条件结果映射的Pandas/Numpy方案
你的代码存在的问题
- 条件定义错误:Pandas Series的比较直接返回布尔数组,不需要加
if关键字 - 结果容器错误:
results用了无序的集合{},应改为有序列表[],保证和条件顺序严格对应 - 赋值逻辑错误:
grade.append()用法不符合语法,且最终给df['grade']赋值的逻辑完全错误
方案1:numpy.select()(自定义多条件场景)
适合需要灵活定义非连续/复杂条件的场景,是替代if-elif的典型方法:
import numpy as np import pandas as pd # 构造示例数据 df = pd.DataFrame({'score': [45, 79, 88, 56, 94]}) # 定义布尔条件列表(无需if,直接用Series比较) conditions = [ df['score'] >= 90, (df['score'] >= 80) & (df['score'] < 90), (df['score'] >= 70) & (df['score'] < 80), (df['score'] >= 65) & (df['score'] < 70), df['score'] < 65 ] # 对应结果列表(顺序必须和条件严格匹配) results = ['A', 'B', 'C', 'D', 'F'] # 执行映射 df['grade'] = np.select(conditions, results) print(df)
输出结果:
score grade 0 45 F 1 79 C 2 88 B 3 56 F 4 94 A
方案2:pandas.cut()(连续区间分段场景)
如果你的条件是连续数值区间,用pd.cut()更简洁高效:
import pandas as pd df = pd.DataFrame({'score': [45, 79, 88, 56, 94]}) # 定义区间边界(左闭右开,最后一个区间包含所有更大值) bins = [-float('inf'), 65, 70, 80, 90, float('inf')] # 对应区间的标签 labels = ['F', 'D', 'C', 'B', 'A'] # 执行区间映射,include_lowest=True确保最左区间包含最小值 df['grade'] = pd.cut(df['score'], bins=bins, labels=labels, include_lowest=True) print(df)
输出和方案1完全一致。
补充说明
你之前记忆的方法应该就是np.select()或pd.cut(),二者都是Pandas/Numpy生态中替代if-elif多条件判断的标准实现。
内容的提问来源于stack exchange,提问作者Coding_Nubie
相关产品推荐
相关产品推荐

