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

如何在pandas DataFrame中通过自定义函数实现Discount折扣列

Pandas自定义折扣列计算修正方案

需求背景

完成学校课程项目时,需构建统计表展示特定客户的购买商品及对应消费金额,当前已得到初始处理结果(参考表1),需要通过自定义函数实现折扣(Rabatt)列计算,折扣规则如下:

  • 若Menge字段值大于24,折扣值为3
  • 若Menge字段值大于12(且不满足大于24的条件),折扣值为1
  • 不满足以上条件折扣值为0
    预期实现效果参考表2。

原有代码问题

原有代码无法得到正确结果,存在以下几处错误:

  1. 冗余导入:重复三次导入numpy和pandas库,无实际作用
  2. 函数语法错误:自定义Rabatt函数的入参为行对象row,但内部取值时错写为Rabatt["Menge"],且elif分支漏写取值对象,直接写["Menge"] > 24不符合语法规范
  3. 逻辑顺序错误:值大于24时必然同时满足大于12的条件,原有代码先判断Menge>12的分支,会导致所有大于12的数值直接返回1,永远无法触发大于24对应折扣值3的逻辑
  4. 变量引用错误:最后给表新增列时使用了未定义的变量data,实际操作对象是存储订单数据的bestellungen
  5. 缺失默认返回值:函数没有设置不满足折扣条件时的返回值,会导致对应行折扣列为空值

修正后完整代码

import numpy as np
import pandas as pd

# 读取数据源
bestellungen = pd.read_csv('bestellungen.csv', sep=';', index_col=0)
kunden = pd.read_csv('kunden.csv', sep=';', index_col=0)
rabattstaffel = pd.read_csv('rabattstaffel.csv', sep=';', index_col=0)

# 计算Menge字段值
bestellungensum = bestellungen.sum(axis=1)
bestellungen = bestellungen.assign(Menge=bestellungensum)

# 折扣计算自定义函数
def Rabatt(row):
    # 优先判断阈值更高的条件,避免低优先级条件覆盖高优先级规则
    if row["Menge"] > 24:
        return 3
    elif row["Menge"] > 12:
        return 1
    # 不满足折扣条件默认返回0
    else:
        return 0

# 逐行应用函数生成折扣列
bestellungen["Rabatt"] = bestellungen.apply(Rabatt, axis=1)

# 输出结果校验
print(bestellungen)

注:如果后续流程不需要使用kunden和rabattstaffel两个表的数据,可以删除对应读取代码,不影响折扣列计算逻辑。

内容的提问来源于stack exchange,提问作者Justin Holiday

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 09:57:29