如何从DataFrame生成无重复行和列的排列组合?
生成DataFrame中行列不重复的排列组合
需求与示例
现有如下结构的DataFrame:
column_1 column_2 column_3 a 2 3 7 b 9 4 3 c 1 5 2
需要生成所有行列不重复使用的元素组合:每个组合中的元素分别来自不同的行和不同的列,最终得到n!个结果(n为DataFrame的行列数,此处n=3,共6个),期望输出如下:
Out: [(2,4,2),(2,5,3),(9,3,2),(9,5,7),(1,3,3),(1,4,7)]
错误尝试
使用itertools.product的方式会生成n^n个组合(此处为27个),不符合行列不重复的要求,代码如下:
from itertools import product permutations = list(product(df['column_1'], df['column_2'], df['column_3'])) print(permutations)
正确实现方案
核心思路是通过列索引的全排列,确保每个组合选取不同列的元素,同时按行顺序对应选取,保证行不重复。
代码示例:
import pandas as pd from itertools import permutations # 构造示例DataFrame df = pd.DataFrame({ 'column_1': [2, 9, 1], 'column_2': [3, 4, 5], 'column_3': [7, 3, 2] }, index=['a', 'b', 'c']) # 生成列名的所有全排列 column_permutations = permutations(df.columns) # 遍历每个列排列,按行选取对应元素 result = [] for cols in column_permutations: combination = tuple(df.loc[row, col] for row, col in zip(df.index, cols)) result.append(combination) print(result)
执行后输出:
[(2, 4, 2), (2, 5, 3), (9, 3, 2), (9, 5, 7), (1, 3, 3), (1, 4, 7)]
逻辑说明
permutations(df.columns)生成所有列名的全排列,共3! = 6种,正好对应需要的组合数量。- 对每个列排列,按行的顺序(a、b、c)依次选取对应列的元素,确保每个元素来自不同的行和列,满足行列不重复的要求。
内容的提问来源于stack exchange,提问作者James Anderson
相关产品推荐
相关产品推荐

