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

Python实现基准列固定的多列无重复组合求和方案问询

Python实现基准列与附加列的无重复组合求和

问题需求

现有一张数据表,包含基准列value_base和附加列value_add_a到value_add_e。需要针对每一组level1和level2的索引组合,生成所有符合规则的价格组合:

  • 价格计算逻辑:基准列数值加上 0到5个不重复附加列 的数值之和
  • 去重规则:只要附加列的集合相同,就算顺序不一样也视为重复,必须排除

原代码的问题

你之前用itertools.permutations写的代码有两个关键问题:

  1. permutations生成的是排列,会把同一组附加列按不同顺序重复生成,导致结果有大量重复
  2. 只处理了选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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 21:08:19