Python实现基准列固定的多列无重复组合求和方案问询
Python实现基准列与附加列的无重复组合求和
问题需求
现有一张数据表,包含基准列value_base和附加列value_add_a到value_add_e。需要针对每一组level1和level2的索引组合,生成所有符合规则的价格组合:
- 价格计算逻辑:基准列数值加上 0到5个不重复附加列 的数值之和
- 去重规则:只要附加列的集合相同,就算顺序不一样也视为重复,必须排除
原代码的问题
你之前用itertools.permutations写的代码有两个关键问题:
permutations生成的是排列,会把同一组附加列按不同顺序重复生成,导致结果有大量重复- 只处理了选5个附加列的情况,完全没覆盖0到4个的场景
原代码:
import itertools a = list(itertools.permutations([2, 3, 4, 5, 6])) b = [1] c = [list(permutation) + b for permutation in a] print(c)
可行实现方案
换用itertools.combinations就能解决重复问题,再通过遍历选取数量覆盖0到5的所有情况,结合基准值计算总价即可。
基础模拟示例
用数值模拟基准列和附加列的情况,代码如下:
import itertools # 模拟数据:基准值、附加列数值列表 base_value = 1 add_values = [2, 3, 4, 5, 6] # 存储所有有效结果 result = [] # 遍历从0到5个附加列的选取情况 for pick_count in range(0, len(add_values)+1): # 生成pick_count个附加列的所有组合(不考虑顺序,自动去重) for combo in itertools.combinations(add_values, pick_count): # 计算总价:基准值 + 组合内附加列的和 total_price = base_value + sum(combo) # 记录组合和总价(如果需要关联列名,可把add_values换成列标识列表) result.append({ '附加列组合': combo, '总价': total_price }) # 打印前10条结果看看效果 for item in result[:10]: print(item)
针对数据表的分组实现
如果是处理Pandas数据表,要按level1和level2分组计算,代码可以这么写:
import pandas as pd import itertools # 模拟测试数据表 df = pd.DataFrame({ 'level1': ['A', 'A', 'B', 'B'], 'level2': ['X', 'Y', 'X', 'Y'], 'value_base': [10, 20, 15, 25], 'value_add_a': [2, 3, 4, 5], 'value_add_b': [3, 4, 5, 6], 'value_add_c': [4, 5, 6, 7], 'value_add_d': [5, 6, 7, 8], 'value_add_e': [6, 7, 8, 9] }) # 定义所有附加列的列名 add_cols = ['value_add_a', 'value_add_b', 'value_add_c', 'value_add_d', 'value_add_e'] # 存储最终结果 final_results = [] # 按level1和level2分组处理每一行数据 for (level1, level2), group in df.groupby(['level1', 'level2']): # 获取当前分组的基准值(假设每组只有一条数据) base_val = group['value_base'].iloc[0] # 获取当前分组的附加列数值和对应列名的配对列表 add_pairs = list(zip(add_cols, group[add_cols].iloc[0].tolist())) # 遍历0到5个附加列的选取情况 for pick_count in range(0, len(add_cols)+1): for combo in itertools.combinations(add_pairs, pick_count): # 拆分出选中的列名和数值 selected_cols = [col for col, val in combo] selected_vals = [val for col, val in combo] # 计算总价 total_price = base_val + sum(selected_vals) # 记录分组信息、选中列和总价 final_results.append({ 'level1': level1, 'level2': level2, '选中附加列': selected_cols, '总价': total_price }) # 转成DataFrame查看结果 result_df = pd.DataFrame(final_results) print(result_df.head(10))
代码说明
itertools.combinations:只生成不考虑顺序的组合,从根源上避免了顺序不同的重复结果range(0, len(add_values)+1):遍历从选0个(仅基准值)到选5个附加列的所有场景- 数据表分组处理:通过
groupby确保每个level1+level2组合独立计算所有可能的价格组合
内容的提问来源于stack exchange,提问作者GT1981
相关产品推荐
相关产品推荐

