Python中np.where多条件创建DataFrame新列报错解决方法
报错原因
你的代码存在4个核心问题,直接触发报错或导致计算结果错误:
- 列名、变量名引用错误:规则中使用的字段为
Quantity Total Price,代码中误写为Quantity Total First,还引用了当前上下文中不存在的data_state2变量 np.where用法不符合规范:np.where仅支持单条件双分支判断,不支持直接传入多条件列表匹配多结果值,传入的条件列表长度和DataFrame索引长度不匹配,直接触发ValueError- 区间规则不严谨:自定义的条件存在边界重叠、区间遗漏问题,没有覆盖大于60亿的取值区间,边界判断不符合左开右闭的规则要求
- 赋值逻辑错误:直接对
merged['Rate1']字段赋值会覆盖原始Rate1值,后续权重计算会读取到被修改后的值,导致结果偏差
可直接运行的正确代码
优先推荐使用pd.cut实现分箱计算,逻辑清晰不易出现边界错误:
import pandas as pd import numpy as np # 定义区间边界、每个区间对应的Rate权重(Rate1权重 = 1 - Rate权重) bins = [0, 50000000, 500000000, 2000000000, 4000000000, 6000000000, 99999999999999] rate_weights = [1, 0.9, 0.8, 0.5, 0.25, 0] # 备份原始Rate1值,避免覆盖导致计算错误 original_rate1 = merged['Rate1'].copy() # 分箱匹配对应权重 merged['最终费率'] = pd.cut( merged['Quantity Total Price'], bins=bins, labels=rate_weights, include_lowest=True ).astype(float) # 按权重计算最终结果 merged['最终费率'] = merged['Rate'] * merged['最终费率'] + original_rate1 * (1 - merged['最终费率'])
如果需要使用np.where实现,可使用嵌套写法,同样可以得到正确结果:
original_rate1 = merged['Rate1'].copy() qtp = merged['Quantity Total Price'] merged['最终费率'] = np.where( qtp <= 50000000, merged['Rate'], np.where( qtp <= 500000000, merged['Rate']*0.9 + original_rate1*0.1, np.where( qtp <= 2000000000, merged['Rate']*0.8 + original_rate1*0.2, np.where( qtp <= 4000000000, merged['Rate']*0.5 + original_rate1*0.5, np.where( qtp <= 6000000000, merged['Rate']*0.25 + original_rate1*0.75, original_rate1 ) ) ) ) )
结果校验
用你给出的测试样例验证,计算结果完全匹配预期:
- 数量总价20000000 → 结果15
- 数量总价100000000 → 结果14.95
- 数量总价700000000 → 结果14.9
- 数量总价3000000000 → 结果14.75
- 数量总价5000000000 → 结果14.625
- 数量总价7000000000 → 结果14.5
注意:禁止直接覆盖原始
Rate1列存储计算结果,否则计算过程中会读取到被修改的Rate1值,导致权重计算偏差,建议新建独立列存储最终结果。
内容的提问来源于stack exchange,提问作者Bianconera99
相关产品推荐
相关产品推荐

