如何在pandas DataFrame中通过自定义函数实现Discount折扣列
Pandas自定义折扣列计算修正方案
需求背景
完成学校课程项目时,需构建统计表展示特定客户的购买商品及对应消费金额,当前已得到初始处理结果(参考表1),需要通过自定义函数实现折扣(Rabatt)列计算,折扣规则如下:
- 若
Menge字段值大于24,折扣值为3 - 若
Menge字段值大于12(且不满足大于24的条件),折扣值为1 - 不满足以上条件折扣值为0
预期实现效果参考表2。
原有代码问题
原有代码无法得到正确结果,存在以下几处错误:
- 冗余导入:重复三次导入
numpy和pandas库,无实际作用 - 函数语法错误:自定义
Rabatt函数的入参为行对象row,但内部取值时错写为Rabatt["Menge"],且elif分支漏写取值对象,直接写["Menge"] > 24不符合语法规范 - 逻辑顺序错误:值大于24时必然同时满足大于12的条件,原有代码先判断
Menge>12的分支,会导致所有大于12的数值直接返回1,永远无法触发大于24对应折扣值3的逻辑 - 变量引用错误:最后给表新增列时使用了未定义的变量
data,实际操作对象是存储订单数据的bestellungen - 缺失默认返回值:函数没有设置不满足折扣条件时的返回值,会导致对应行折扣列为空值
修正后完整代码
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
相关产品推荐
相关产品推荐

