使用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
相关产品推荐
相关产品推荐

