给定约束条件下如何查找pandas DataFrame的有效元素组合
解决方案
核心逻辑
该需求本质是枚举所有从m行中取n个不重复行的排列,排列的顺序对应n个列的顺序,保证每个组合里的元素既不同行也不同列,且长度等于列数n。
实现代码
import pandas as pd from itertools import permutations def get_valid_combinations(df: pd.DataFrame) -> list[tuple]: n_cols = df.shape[1] n_rows = df.shape[0] valid_combs = [] # 生成长度为n_cols的行索引排列,天然保证行不重复 for row_seq in permutations(range(n_rows), n_cols): # 按列顺序取对应行的元素,天然保证列不重复 current_comb = tuple(df.iloc[row_idx, col_idx] for col_idx, row_idx in enumerate(row_seq)) valid_combs.append(current_comb) return valid_combs
示例验证
以你给出的3*2大小的DataFrame为例:
# 构造示例DataFrame df = pd.DataFrame([ [1, 2], [3, 4], [5, 6] ]) print(get_valid_combinations(df))
输出结果为:
[(1, 4), (1, 6), (3, 2), (3, 6), (5, 2), (5, 4)]
和你给出的示例规则完全匹配:(1,4)为有效组合,同列的(1,3)、同行的(1,2)均不在结果中。
扩展说明
- 如果需要获取元素的坐标而非值,只需将
df.iloc[row_idx, col_idx]替换为(row_idx, col_idx)即可 - 当行数m小于列数n时,函数会自动返回空列表,符合无解的实际逻辑
- 该方法不受DataFrame自定义行名/列名的影响,全程使用位置索引取值,兼容性更强
内容的提问来源于stack exchange,提问作者Abdullah Bahi
相关产品推荐
相关产品推荐

