Pandas/PySpark实现voucher从新到旧逆序抵扣计算credit余额
DataFrame实现credit余额按序抵扣voucher金额方案
核心抵扣规则
- 抵扣优先级:严格按照凭证从新到旧顺序,即
v3→v2→v1依次扣减 - 扣减逻辑:单张voucher最多抵扣至0,不会产生负值;credit余额耗尽后,后续未参与抵扣的voucher保持原值不变
- 余额留存:所有voucher抵扣完成后,剩余的credit金额保留在原
credit列中
Pandas 实现(适配本地Python Notebook环境)
采用pandas向量化运算实现,性能远高于逐行apply,支持十万到百万级数据快速计算。
import pandas as pd import numpy as np # 1. 构造测试数据集(结构与业务数据一致) df = pd.DataFrame({ "user_id": [1, 2, 3, 4], "credit": [100, 25, 80, 10], "v1": [30, 20, 50, 15], "v2": [40, 10, 20, 20], "v3": [50, 15, 30, 5] }) # 2. 核心抵扣逻辑 # 按抵扣顺序排列voucher列,新增凭证只需调整该列表顺序即可 voucher_cols = ["v3", "v2", "v1"] remain_credit = df["credit"].copy() for col in voucher_cols: # 计算当前voucher可抵扣的金额:取剩余credit和当前voucher余额的较小值 deduct_amount = np.minimum(remain_credit, df[col]) # 更新voucher抵扣后余额 df[col] = df[col] - deduct_amount # 更新剩余可用credit remain_credit = remain_credit - deduct_amount # 3. 回写最终剩余credit df["credit"] = remain_credit
执行后直接打印df即可得到符合要求的计算结果,无需额外处理空值、负值场景。
PySpark 实现(适配分布式计算环境)
采用PySpark原生列表达式实现,所有计算在集群侧完成,不需要将分布式数据拉取到本地驱动节点,支持TB级数据处理。
from pyspark.sql import SparkSession import pyspark.sql.functions as F # 初始化Spark会话(Notebook环境通常已预初始化,可跳过该步骤) spark = SparkSession.builder.appName("credit_voucher_deduct").getOrCreate() # 1. 构造测试数据集 data = [ (1, 100, 30, 40, 50), (2, 25, 20, 10, 15), (3, 80, 50, 20, 30), (4, 10, 15, 20, 5) ] df = spark.createDataFrame(data, schema=["user_id", "credit", "v1", "v2", "v3"]) # 2. 核心抵扣逻辑 voucher_cols = ["v3", "v2", "v1"] # 初始化剩余credit为原始credit列 remain_credit_col = F.col("credit") for col in voucher_cols: current_voucher = F.col(col) # 计算当前列可抵扣金额 deduct_amount = F.least(remain_credit_col, current_voucher) # 更新voucher列值 df = df.withColumn(col, current_voucher - deduct_amount) # 更新剩余credit计算表达式 remain_credit_col = remain_credit_col - deduct_amount # 3. 回写最终剩余credit df = df.withColumn("credit", remain_credit_col) # 查看结果 df.show()
扩展说明
- 如果后续新增v4、v5等凭证,只需要将新凭证列名按「新凭证在前、旧凭证在后」的顺序加入
voucher_cols列表即可,不需要修改核心计算逻辑 - 两个实现都自动处理了边界场景:credit为0、voucher金额为0、credit不足以覆盖首个voucher等场景均不会出现计算错误
内容的提问来源于stack exchange,提问作者indritkalaj
相关产品推荐
相关产品推荐

