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

如何利用DataFrame查找符合目标结果的限定数量密钥组合?

原始密钥矩阵

ABCDE
Key 11-1000
Key 201-100
Key 3001-10
Key 4-11000
Key 510-100
Key 6010-10
Key 70010-1
Key 801-210

目标结果

ABCDE
01-100

问题需求

现有上述DataFrame,每个Key是可用于组合生成目标结果的选项。需指定最大组合数量,遍历所有符合数量限制的密钥组合,当组合的行和等于目标结果时,输出对应的Key集合和组合数量。

示例(最大组合数设为3):

  • Key 2(单独使用),组合数1
  • Key 4 + Key 5,组合数2
  • Key 3 + Key 8,组合数2

实现方案

思路

  1. 预处理数据:将表格中空值替换为0(空白代表该位置数值为0),把目标结果转为数组格式。
  2. 遍历组合数:从1到设定的最大组合数,生成所有对应数量的密钥子集。
  3. 验证匹配:计算每个子集的行和,与目标数组对比,完全匹配则输出结果。

代码实现

import pandas as pd
from itertools import combinations

# 构建原始密钥DataFrame
keys_df = pd.DataFrame({
    'A': [1, None, None, -1, 1, None, None, None],
    'B': [-1, 1, None, 1, None, 1, None, 1],
    'C': [None, -1, 1, None, -1, None, 1, -2],
    'D': [None, None, -1, None, None, -1, None, 1],
    'E': [None, None, None, None, None, None, -1, None]
}, index=['Key 1', 'Key 2', 'Key 3', 'Key 4', 'Key 5', 'Key 6', 'Key 7', 'Key 8'])

# 构建目标结果DataFrame
target_df = pd.DataFrame({
    'A': [None],
    'B': [1],
    'C': [-1],
    'D': [None],
    'E': [None]
})

# 预处理:空值填充为0,转换为数组
keys_df = keys_df.fillna(0)
target = target_df.fillna(0).values.flatten()

# 设定最大组合数
max_comb = 3

# 遍历所有符合数量要求的组合
for k in range(1, max_comb + 1):
    for comb in combinations(keys_df.index, k):
        # 计算组合的行和
        comb_sum = keys_df.loc[list(comb)].sum().values
        # 验证是否匹配目标
        if (comb_sum == target).all():
            print(f"组合:{' + '.join(comb)},组合数:{k}")

代码说明

  • 使用combinations生成不重复的密钥子集,避免重复计算(如Key4+Key5与Key5+Key4视为同一组合)。
  • 空值转0是为了保证求和计算的准确性。
  • 用all()确保所有列的数值都与目标完全一致,避免部分匹配的情况。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 03:26:18