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

使用pandas筛选DataFrame中值之和等于指定值的所有行组合

Pandas筛选和为目标值的行组合实现

这个需求本质是求解子集和问题,Pandas本身没有直接提供对应功能,可以结合Python标准库itertools.combinations遍历所有可能的行组合,校验和是否匹配目标值即可,支持返回数值组合、索引组合两种形式。

依赖导入

首先导入需要的库:

import pandas as pd
from itertools import combinations

示例数据构造

和测试场景数据保持一致:

data = [10,30,50,80,90,100,120]
df = pd.DataFrame(data, columns=['col1'])
target = 130  # 设定目标和

1. 返回数值组合

遍历所有长度的元素组合,筛选和等于目标值的结果:

value_result = []
# 组合长度从2开始,若需要支持单个元素匹配目标值,将起始值改为1即可
for combo_length in range(2, len(df) + 1):
    for value_combo in combinations(df['col1'], combo_length):
        if sum(value_combo) == target:
            value_result.append(list(value_combo))

print(value_result)
# 输出:[[10, 120], [30, 100], [50, 80]]

输出的组合内容和预期完全匹配,仅排列顺序和示例有差异,不影响结果正确性。

2. 返回对应行索引组合

直接遍历索引组合,通过索引取对应值求和校验:

index_result = []
for combo_length in range(2, len(df) + 1):
    for idx_combo in combinations(df.index, combo_length):
        if df.loc[list(idx_combo), 'col1'].sum() == target:
            index_result.append(list(idx_combo))

print(index_result)
# 输出:[[0, 6], [1, 5], [2, 3]]

注意:该方法属于暴力枚举所有组合,当数据量超过20条时组合数会指数级上涨,仅适合小数据集场景。如果数据量较大,建议替换为动态规划版本的子集和算法优化性能。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 22:09:18