如何在Pandas中基于多条件与计算创建折扣列?
在Pandas中基于多列多规则创建折扣列的最优方法
处理这类多规则的列生成需求,**numpy.select()**是最优方案——它采用向量化运算,性能远高于循环或apply()方法,同时代码结构清晰,规则与结果对应明确,便于后续维护调整。
实现步骤
- 导入依赖库
import pandas as pd import numpy as np
- 定义规则条件与对应折扣值
按规则的优先级排序(越具体的规则越靠前,避免被宽泛规则覆盖),依次定义条件列表和对应的折扣结果列表:
# 定义匹配条件 conditions = [ # 规则3:Unique id为4094、品牌为E且years_active为空 (df["Unique id"] == 4094) & (df["品牌"] == "E") & df["years_active"].isna(), # 规则2子项1:Unique id为6352/7869,价格60≤price<70 (df["Unique id"].isin([6352, 7869])) & (df["price"].between(60, 70, inclusive="left")), # 规则2子项2:Unique id为6352/7869,价格70≤price<80 (df["Unique id"].isin([6352, 7869])) & (df["price"].between(70, 80, inclusive="left")), # 规则1:品牌为A或B df["品牌"].isin(["A", "B"]) ] # 对应每个条件的折扣值 choices = [ df["price"], # 规则3:折扣等于原价 10, # 规则2子项1:固定折扣10 20, # 规则2子项2:固定折扣20 df["price"] * 0.2 # 规则1:原价的20% ]
- 生成折扣列
使用np.select()匹配条件并赋值,同时设置无匹配规则时的默认值(示例设为0,可根据业务需求调整为np.nan或其他值):
df["折扣"] = np.select(conditions, choices, default=0)
示例验证
假设你的数据如下:
| Unique id | 品牌 | price | years_active |
|---|---|---|---|
| 6352 | C | 65 | 5 |
| 7869 | A | 75 | 3 |
| 4094 | E | 100 | NaN |
| 1234 | B | 50 | 2 |
| 5678 | D | 90 | 4 |
运行代码后生成的折扣列结果:
| 折扣 |
|---|
| 10 |
| 20 |
| 100 |
| 10 |
| 0 |
核心优势
- 性能高效:向量化运算避免了逐行遍历,处理大数据集时速度提升明显;
- 逻辑清晰:条件与结果一一对应,规则调整只需修改
conditions和choices的顺序或内容; - 灵活性强:可通过调整条件顺序改变规则优先级,默认值也能适配不同业务场景。
内容的提问来源于stack exchange,提问作者Rebel_09
相关产品推荐
相关产品推荐

