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

PySpark如何按条件对数组指定值求和且结果不超过目标阈值

数组子集最大求和(不超过目标值)功能实现

需求说明

新增Total列的计算逻辑如下:

  • 先计算给定数组所有元素的总和
  • 若总和 ≤ 目标值,Total直接返回该总和
  • 若总和 > 目标值,Total返回小于等于目标值的最大子集求和结果

参考示例

Target %ArraynameTotal
4.5[1.5,2.5,3.0,2.0]John4.5
3[2.5,1.0,0.5,1.0]Jim3.0
5[1.0,1.0,1.5,1.0]Jane4.5

实现代码

该需求本质是经典的01背包问题,以下为Python实现方案:

def max_subset_sum(target, arr):
    # 浮点数放大10倍转换为整数计算,避免精度丢失
    dp = [0] * (int(target * 10) + 1)
    target_int = int(target * 10)
    for num in arr:
        num_int = int(num * 10)
        # 01背包倒序遍历容量
        for j in range(target_int, num_int - 1, -1):
            dp[j] = max(dp[j], dp[j - num_int] + num_int)
    return dp[target_int] / 10

# 测试验证
print(max_subset_sum(4.5, [1.5,2.5,3.0,2.0])) # 输出4.5
print(max_subset_sum(3, [2.5,1.0,0.5,1.0])) # 输出3.0
print(max_subset_sum(5, [1.0,1.0,1.5,1.0])) # 输出4.5

Pandas批量处理表数据示例

如果是处理整表数据,可以直接用apply方法批量生成新列:

import pandas as pd

# 构造示例数据表
df = pd.DataFrame({
    "Target %": [4.5, 3, 5],
    "Array": [[1.5,2.5,3.0,2.0], [2.5,1.0,0.5,1.0], [1.0,1.0,1.5,1.0]],
    "name": ["John", "Jim", "Jane"]
})

# 批量生成Total列
df["Total"] = df.apply(lambda row: max_subset_sum(row["Target %"], row["Array"]), axis=1)

内容的提问来源于stack exchange,提问作者Alex Triece

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 14:06:08