在数据分析中,我们常常要依据若干业务规则为DataFrame的每一行打标签或计算新字段。相比写一堆嵌套判断,使用numpy的np.select可以把多个条件和对应结果集中表达,既直观又高效。

一、np.select基本用法
np.select接收两个核心参数:condlist(条件列表)和choicelist(取值列表),还可以用default指定都不满足时的默认值。它会按条件顺序逐行判断,返回第一个满足条件对应的取值。
1. 构造示例数据
import pandas as pd
import numpy as np
# 构造学生成绩表
df = pd.DataFrame({
'name': ['小明', '小红', '小刚', '小丽'],
'score': [85, 58, 73, 92]
})
print(df)
2. 多条件写回每一行
下面根据分数给每个学生评定等级,规则为:大于等于90为A,70到89为B,60到69为C,其余为D。
conditions = [
df['score'] >= 90,
(df['score'] >= 70) & (df['score'] < 90),
(df['score'] >= 60) & (df['score'] < 70),
df['score'] < 60
]
choices = ['A', 'B', 'C', 'D']
df['level'] = np.select(condlist=conditions, choicelist=choices, default='D')
print(df)
二、为什么比apply更合适
用apply逐行调用Python函数会带来解释器开销,而np.select底层是向量化操作,条件和取值都是numpy数组,整体速度快很多。同时,条件与结果成对出现,后期修改规则只需要调整列表,不必改动整体结构。
三、常见注意点
- 条件列表和取值列表长度必须一致,否则会报错。
- 条件按顺序匹配,前面的条件命中后就不会再看后面,因此要把更严格或优先级更高的条件放在前面。
- 如果所有条件都不满足且未设置default,对应位置会填为nan。
四、结合原行数据生成新字段
choicelist里的元素也可以是计算结果,不限于固定值。例如根据等级给奖学金金额:
money_conditions = [
df['level'] == 'A',
df['level'] == 'B',
df['level'] == 'C'
]
money_choices = [2000, 1000, 500]
df['scholarship'] = np.select(money_conditions, money_choices, default=0)
print(df)
五、小结
当需要对DataFrame每一行写多个条件并赋值时,np.select是非常实用的工具。它用列表清晰表达分支逻辑,配合Pandas向量化计算,既好读又能减少出错。掌握了条件顺序和default用法,就能轻松应对大部分按行打标和分层计算场景。