Pandas多条件用np.where/loc为DataFrame新增加权计算列
Pandas新增区间计算列实现方案
优先使用pandas.cut做分箱权重匹配,避免多层嵌套判断的边界错误,代码可读性和稳定性更高,不会出现逻辑覆盖问题。
推荐实现代码
import pandas as pd # 定义区间边界:因金额非负,左边界设为-1覆盖0值,right=True默认右边界闭合 bins = [-1, 500, 1000, 1500, 2000, 2500, 999999999] # 每个区间对应Rate1的权重,顺序与bins区间一一对应 rate1_weights = [0, 0.1, 0.2, 0.5, 0.25, 1] # 为每行匹配对应权重 merged["w"] = pd.cut( merged["Quantity Total Price"], bins=bins, labels=rate1_weights, right=True ).astype(float) # 统一公式计算Result,适配所有区间规则:Result = w*Rate1 + (1-w)*Rate merged["Result"] = merged["w"] * merged["Rate1"] + (1 - merged["w"]) * merged["Rate"] # 删除临时权重列 merged = merged.drop(columns=["w"])
测试样例校验
给出的测试数据:Quantity Total Price=1000、Rate1=14.5、Rate=15
- 1000匹配到
(500, 1000]区间,对应权重w=0.1 - 计算结果:
0.1*14.5 + 0.9*15 = 14.95,完全符合规则要求。
边界调整说明:如果业务要求500归属0.1权重区间(即[500,1000]区间包含500),只需将第一个区间边界调整为
-1, 499.999,或修改对应判断条件即可。
其他写法的常见错误原因
之前用np.where或loc未得到预期结果,通常是以下问题:
np.where多层嵌套时括号不匹配、区间判断顺序写反、开闭区间符号错误(比如将<=1000写为<1000,会导致1000被错分到下一个区间)loc赋值时区间重叠,后执行的赋值逻辑覆盖了之前的正确结果,或漏写边界值导致部分行计算结果为NaN
可选np.where嵌套写法(不推荐,区间较多时极易出错)
import numpy as np merged["Result"] = np.where( merged["Quantity Total Price"] <= 500, merged["Rate"], np.where( merged["Quantity Total Price"] <= 1000, merged["Rate1"]*0.1 + merged["Rate"]*0.9, np.where( merged["Quantity Total Price"] <= 1500, merged["Rate1"]*0.2 + merged["Rate"]*0.8, np.where( merged["Quantity Total Price"] <= 2000, merged["Rate1"]*0.5 + merged["Rate"]*0.5, np.where( merged["Quantity Total Price"] <= 2500, merged["Rate1"]*0.25 + merged["Rate"]*0.75, merged["Rate1"] ) ) ) ) )
可选loc写法(需注意赋值顺序避免覆盖)
# 初始化结果列 merged["Result"] = 0 # 从最高区间开始赋值,避免重叠覆盖 merged.loc[merged["Quantity Total Price"] > 2500, "Result"] = merged["Rate1"] merged.loc[(merged["Quantity Total Price"] > 2000) & (merged["Quantity Total Price"] <= 2500), "Result"] = merged["Rate1"]*0.25 + merged["Rate"]*0.75 merged.loc[(merged["Quantity Total Price"] > 1500) & (merged["Quantity Total Price"] <= 2000), "Result"] = merged["Rate1"]*0.5 + merged["Rate"]*0.5 merged.loc[(merged["Quantity Total Price"] > 1000) & (merged["Quantity Total Price"] <= 1500), "Result"] = merged["Rate1"]*0.2 + merged["Rate"]*0.8 merged.loc[(merged["Quantity Total Price"] >= 500) & (merged["Quantity Total Price"] <= 1000), "Result"] = merged["Rate1"]*0.1 + merged["Rate"]*0.9 merged.loc[merged["Quantity Total Price"] < 500, "Result"] = merged["Rate"]
内容的提问来源于stack exchange,提问作者Bianconera99
相关产品推荐
相关产品推荐

