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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 22:38:23