PySpark如何按条件对数组指定值求和且结果不超过目标阈值
数组子集最大求和(不超过目标值)功能实现
需求说明
新增Total列的计算逻辑如下:
- 先计算给定数组所有元素的总和
- 若总和 ≤ 目标值,
Total直接返回该总和 - 若总和 > 目标值,
Total返回小于等于目标值的最大子集求和结果
参考示例
| Target % | Array | name | Total |
|---|---|---|---|
| 4.5 | [1.5,2.5,3.0,2.0] | John | 4.5 |
| 3 | [2.5,1.0,0.5,1.0] | Jim | 3.0 |
| 5 | [1.0,1.0,1.5,1.0] | Jane | 4.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
相关产品推荐
相关产品推荐

