如何利用DataFrame查找符合目标结果的限定数量密钥组合?
原始密钥矩阵
| A | B | C | D | E | |
|---|---|---|---|---|---|
| Key 1 | 1 | -1 | 0 | 0 | 0 |
| Key 2 | 0 | 1 | -1 | 0 | 0 |
| Key 3 | 0 | 0 | 1 | -1 | 0 |
| Key 4 | -1 | 1 | 0 | 0 | 0 |
| Key 5 | 1 | 0 | -1 | 0 | 0 |
| Key 6 | 0 | 1 | 0 | -1 | 0 |
| Key 7 | 0 | 0 | 1 | 0 | -1 |
| Key 8 | 0 | 1 | -2 | 1 | 0 |
目标结果
| A | B | C | D | E |
|---|---|---|---|---|
| 0 | 1 | -1 | 0 | 0 |
问题需求
现有上述DataFrame,每个Key是可用于组合生成目标结果的选项。需指定最大组合数量,遍历所有符合数量限制的密钥组合,当组合的行和等于目标结果时,输出对应的Key集合和组合数量。
示例(最大组合数设为3):
- Key 2(单独使用),组合数1
- Key 4 + Key 5,组合数2
- Key 3 + Key 8,组合数2
实现方案
思路
- 预处理数据:将表格中空值替换为0(空白代表该位置数值为0),把目标结果转为数组格式。
- 遍历组合数:从1到设定的最大组合数,生成所有对应数量的密钥子集。
- 验证匹配:计算每个子集的行和,与目标数组对比,完全匹配则输出结果。
代码实现
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
相关产品推荐
相关产品推荐

