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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 03:03:26